上次研究了GBK双字节注入,这次就得想办法用于实战,我们知道在很多时候,代码会对我们的输入进行过滤或者转义,过滤的的话我们想办法绕过就行,而转义,就得另想办法了
addslashes()
这是PHP中的一个安全函数
addslashes() 函数在指定的预定义字符前添加反斜杠。
这些预定义字符是:
单引号 (‘)
双引号 (“)
反斜杠 (\)
NULL
语法
addslashes(string)
参数
描述
string
必需。规定要检查的字符串。
提示和注释
提示:该函数可用于为存储在数据库中的字符串以及数据库查询语句准备合适的字符串。
注释:默认情况下,PHP 指令 magic_quotes_gpc 为 on,对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。
这是来源于W3school中对于函数的解释
如上所说,会对用户输入的
单引号 (‘)
双引号 (“)
反斜杠 (\)
NULL
进行转义,而字符型注入的话单引号又是不可少的一部分,那我们怎么办呢?
记得上次的宽字节那篇Blog Paper中说过,addslashes()这个函数是不考虑当前字符集的,那么便可以产生GBK的双字节注入
写了一个test页面
:
testUsername :
Password :
$dbuser ='root';
$dbpass ='';
$dbname ="";
$host = 'localhost';
@$con = mysql_connect($host,$dbuser,$dbpass);
if (!$con)
{
echo "Failed to connect to MySQL: " . mysql_error();
}
@mysql_select_db($dbname,$con) or die ( "Unable to connect to the database: $dbname");
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
$uname = addslashes($_POST['uname']);
$passwd= addslashes($_POST['passwd']);
mysql_query("SET NAMES gbk");
@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo "login success";
echo "
";
echo 'name:'. $row['username'];
echo "
";
echo 'Password:' .$row['password'];
}
else
{
echo "Try again looser";
print_r(mysql_error());
}
}
?>
这是测试页面,如上是个POST的提交页面,可以提交POST数据,我们提交的是帐号密码,而账号和密码都是
$uname = addslashes($_POST['uname']);
$passwd= addslashes($_POST['passwd']);
被保护了起来,而构成的SQL查询语句是这样的:
@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
必须要输入单引号闭合前面的部分。我们看下测试页面

单纯的提交Username和Password
我们构造,我们如果用
'or 1=1#
去试试看看

抓个包看看

可以看到,uname的参数值是经过URL编码的。%27就是我们输入的单引号,这样发送过去的话,会被解析,uname的参数值实际上就是
uname=%5C%27or+1%3D1%23
这样单引号就失去了闭合的效果
按照上次那个说的,那就尝试GBK双字节注入,但和GET不太一样,不太好在URL里面直接加%df,那就借助Burpsuite抓包改包
我们看下,依旧输入
'or 1=1#

然后改变uname的参数值
uname=%df%27or+1%3D1%23

提交后看看

注入成功了,就这么绕过了
赞过:
赞 正在加载……
本文介绍了如何在遇到PHP的addslashes()函数对SQL注入进行防护的情况下,利用GBK双字节注入进行实战绕过。通过创建测试页面并提交带有特殊GBK字符的POST数据,成功实现了SQL注入,展示了在安全函数面前的规避策略。
823

被折叠的 条评论
为什么被折叠?



