SQL注入挖掘思路

2018-12-20  本文已影响0人  Echocipher

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

一般SQLI出现在登陆页面,获取HTTP头(user-agent,client-ip等),订单处理等处。

  1. 普通注入:

如下代码,

<?php  

$uname = $_GET['name'] ;
$sql = "SELECT * FROM user where name=$uname";
$conn=mysql_connect('localhost','root','root');
mysql_select_db("userinfo",$conn);
$result=mysql_query($sql,$conn);
print_r('now sql is:'.$sql.'<br/>result is:');
print_r(mysql_fetch_row($result));
?> 

uname变量没有经过处理,便拼接到数据库指令之中,造成了sql注入风险。

所以我们在审计的时候应该关注一些重点关键字,就可以帮助我们高效的发掘漏洞。

关键字
select from
mysql_connect
mysql_query
mysql_fetch_row
...
  1. 编码注入:

宽字节注入

如下代码:

<?php  

$conn=mysql_connect('localhost','root','root');
mysql_select_db("userinfo",$conn);
mysql_query("SET NAMES 'GBK'");
$uid=addslashes($_GET['id']);
$sql="SELECT * FROM user where name='$uid'";
$result=mysql_query($sql,$conn);
print_r('now sql is:' .$sql. '<br/>result is:');
print_r(mysql_fetch_row($result));
mysql_close();
?>   

这里加入了addslashes函数,对部分字符进行了转义,比如:

这里主要是存在一个问题是,编码设置成了GBK,这里会导致成编码注入,也就是宽字节注入,GB2312、GBK、GB18030、BIG5、Shift_JIS等这些都是常说的宽字节,实际上只有两字节。宽字节带来的安全问题主要是吃ASCII字符(一字节)的现象,这里addslashes会将引号后面加入反斜杠(\),会造成我们无法利用,GBK的编码范围是0x8140~0xFEFE(不包括xx7F),在遇到%df(ascii(223)) >ascii(128)时自动拼接%5c,因此吃掉‘\’,而%27、%20小于ascii(128)的字符就保留了,而反斜杠的编码是%5c,而%df%5c是汉字“運”,所以我们在单引号前加上%df即可将后面的单引号吞掉,造成引号成功逃脱转义:

GBK编码第一字节(高字节)的范围是0x81~0xFE,第二字节(低字节)的范围是0x40~0x7E与0x80~0xFE,这样的十六进制表示。而\符号的十六进制表示为0x5C,正好在GBK的低字节中,如果之前有一个高字节,那么正好会被组成一个合法字符,GB2312是被GBK兼容的,它的高位范围是0xA1~0xF7,低位范围是0xA1~0xFE(0x5C不在该范围内),因此不能使用编码吃掉%5c,其它的宽字符集也是一样的分析过程,要吃掉%5c,只需要低位中包含正常的0x5c就行了。

这里一定要注意sql注入和xss不同,在xss中,把上面的PHP代码的GBK改为GB2312,在浏览器中处理行为同GBK,也许是由于GBK兼容GB2312,浏览器都做了同样的兼容:把GB2312统一按GBK行为处理

结果如下:


关键字
SET NAMES
character_set_client=gbk
mysql_set_charset('gbk')

二次urldecode注入

字符进行转换就会有可能产生漏洞,现在大多数web程序都会进行参数过滤,一般会选择addslashes() 等函数或者开启GPC来对特殊符号进行转义,如果某处使用了urldecode或者rawurldecode函数会导致二次解码生成单引号而引起注入。

测试代码:

<?php  

$a=addslashes($_GET['p']);
$b=urldecode($a);
echo 'a='.$a;
echo "<br/>";
echo 'b='.$b;
?>  

这里我们有两个变量,a变量是使用addslashes函数对get得到的p进行转义,b变量是对a进行urldecode的结果,由于使用了addslashes,所以我们的单引号后面加上了反斜杠:

但是由于urldecode函数的存在,我们可以构造如下利用过程:

?p=1%2527

由于浏览器自动进行了一次url解码,所以%25被解码为%,而又因为urldecode函数的作用,%27被解码为单引号('):

关键字
urldecode
rawurldecode

Base64编码注入

类似于URL编码注入,还有Base64编码注入,经过前端Base64转换后,参数被Base64加密,防御模块无法通过关键词分析出此参数的恶意字符。审计过程中遇到Base64_decode函数,之后没有做任何过滤,直接拼接到SQL语句中,就可能导致SQL注入漏洞。

参考文章:

  1. http://netsecurity.51cto.com/art/201404/435074.htm
  2. http://www.qingpingshan.com/m/view.php?aid=152779
上一篇下一篇

猜你喜欢

热点阅读