0x01 背景
PHP程序员在开发过程中难免会使用一些字符替换函数(str_replace)、反转义函数(stripslashes),但这些函数使用位置不当就会绕过全局的防护造成SQL注入漏洞。
0x03 漏洞分析
str_replace函数的错误使用
第一种情况是写程序时会使用str_replace函数将参数中的单引号、括号等字符替换为空,这样在一些双条件查询的情况就会引发注入问题。缺陷代码如下:
<?phprequire_once(‘common.php‘);$conn = mysql_connect(‘localhost‘, ‘root‘, ‘braid‘) or die(‘bad!‘);mysql_query("SET NAMES binary‘");mysql_select_db(‘test‘, $conn) OR emMsg("数据库连接失败");$tmp_id = isset($_GET[‘id‘]) ? $_GET[‘id‘] : 1;$title = isset($_GET[‘title‘]) ? $_GET[‘title‘] : ‘news title‘;//程序编写时直接用str_replace去掉id里的单引号$id = str_replace("‘",‘‘,$tmp_id);//sql查询语句通过id和titile两个条件进行查询$sql = "SELECT * FROM news WHERE id=‘{$id}‘ and title=‘{$title}‘";echo $sql;$result = mysql_query($sql, $conn) or die(mysql_error()); ?> |
浏览器输入”http://localhost/sqltest/streplace.php?id=1‘&title=news title”,发现报错了,我们直接打印出执行的sql语句如下图:
发现参数id右边的单引号被反斜杠转义成字符了,说明又可以注入了。
简单分析下上面id参数的执行过程,-1’经过addslashes函数转义后变成了-1\’,然后再经过str_replace函数干掉了单引号变成了-1\,最后带入查询的语句才是下面这样:
SELECT * FROM news WHERE id=‘1\‘ and title=‘news title‘
反斜杠转义了sql查询语句里id后面那个单引号,导致title参数可以构造sql注入语句了,我们直接构造获取管理员账户密码的语句”http://localhost/sqltest/streplace.php?id=-1‘&title=unionselect 1,2,concat(name,0x23,pass) from admin%23”
第二种情况是str_replace函数是用户可控的,就是说用户想把啥替换成空就可以将什么替换为空。
首先我们先看看addslashes函数对%00-%ff的转义情况,经过fuzz发现%00会被转义为\0,如下:
那么注入的时候我们提交%00’,经过addlashes就会变为\0\’,这时候我们用replace函数替换0为空就变成了\‘,成功转义了转义字符让单引号逃逸出来,从而造成注入漏洞。
stripslashes函数的错误使用
这个函数的定义是删除由 addslashes() 函数添加的反斜杠,所以很明显使用不当的话就会引发SQL注入。缺陷代码如下:
<?phprequire_once(‘common.php‘);$conn = mysql_connect(‘localhost‘, ‘root‘, ‘braid‘) or die(‘bad!‘);mysql_query("SET NAMES binary‘");mysql_select_db(‘test‘, $conn) OR emMsg("数据库连接失败");$tmp_id = isset($_GET[‘id‘]) ? $_GET[‘id‘] : 1;$id = stripslashes($tmp_id);$sql = "SELECT * FROM news WHERE id=‘{$id}‘";echo $sql.‘<br />‘;$result = mysql_query($sql, $conn) or die(mysql_error()); ?> |
浏览器输入”http://localhost/sqltest/stripslashes.php?id=-1‘",发现报错了,echo出执行的sql语句如下图:
分析下参数id的执行过程,-1’经过addslashes函数转义后变成了-1\’,然后再经过stripslashes函数干掉了反斜杠变成了-1’,所以又可以愉快的注入了。
获取管理员账户密码的语句”http://localhost/sqltest/stripslashes.php?id=-1‘ union select 1,2,concat(name,0x23,pass) from admin%23”
原文链接:http://www.cnbraid.com/2016/04/29/sql5/,如需转载请联系作者。