在学习Web网络安全的sql注入时,我一直有个非常严重的疑惑,究竟如何通过报错准确判断出SQL语句的闭合方式?
如下是学习时教材上的标准范例(多个题目进行对比):
http://127.0.0.1/sql/Less-1/?id=1'
http://127.0.0.1/sql/Less-2/?id=1'
http://127.0.0.1/sql/Less-3/?id=1'
http://127.0.0.1/sql/Less-4/?id=1'
http://127.0.0.1/sql/Less-5/?id=1'
集中一下以上的关键内容:
注释:
以第一题为例:此处将其源码的
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
替换成
id='$id' LIMIT 0,1"
将第一题的报错
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1
替换成
near ''1'' LIMIT 0,1' at line 1
(只看关键的地方)
以下为正题:
http://127.0.0.1/sql/Less-1/?id=1'
id='$id' LIMIT 0,1"
near ''1'' LIMIT 0,1' at line 1
http://127.0.0.1/sql/Less-2/?id=1'
id=$id LIMIT 0,1
near '' LIMIT 0,1' at line 1
http://127.0.0.1/sql/Less-3/?id=1'
id=('$id') LIMIT 0,1
near ''1'') LIMIT 0,1' at line 1
http://127.0.0.1/sql/Less-4/?id=1'
id=($id) LIMIT 0,1
无报错
http://127.0.0.1/sql/Less-5/?id=1'
id='$id' LIMIT 0,1
near ''1'' LIMIT 0,1' at line 1
我把1'带进去然后五个例题之间来回比较,但怎么看怎么迷糊,自己想琢磨出它的规律,但自己每次的想法总是满足一个或者两个,但是在剩下的例题上行不通
后来在CSDN上看到了一位大佬发的文章,链接如下:
有所启发,看了大佬发的文章后,我对1'后面的内容有所区分,但脑海里却不由自主的往1'前面的符号看,以下是我的个人的一点点不算改进的改进:
http://127.0.0.1/sql/Less-1/?id=/1\
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
http://127.0.0.1/sql/Less-2/?id=/1\
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
http://127.0.0.1/sql/Less-3/?id=/1\
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
http://127.0.0.1/sql/Less-4/?id=/1\
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";
关于该题报错中/1\前后双引号:
$id = '"' . $id . '"';是什么意思?
`'"'`是一个字符串,它表示一个双引号字符
通过使用点号(`.`)运算符,将`'"'`、`$id`和`'"'`连接在一起,形成一个新的字符串,并将其赋值给变量`$id`
http://127.0.0.1/sql/Less-5/?id=/1\
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
报错一:''/1\' 报错二:'/1\ 报错三:''/1\') 报错四:'"/1\") 报错五:''/1\'
观察这五个报错可以发现,/1\前面固定存在一个"或者',后面剩下的符号就是闭合方式!
为了保证该结论的正确性,我对第四题的源码做了如下修改
报错如下:
报错:'"/1\"'')
套用之前得出的结论,首先消除开头的',再消除掉前后对称的一对"",最后剩下'')(注:'')中的’‘为两个引文单引号!别把它当成了英文的双引号,虽然它俩打出来长得似乎一模一样),符合源码中的闭合方式!
故结论成立,做sql注入时,若?id=1'产生的报错不宜观察,可以和我一样改写成?id=/1\。
(以上内容仅为个人观点和推测,若有不对请大佬评论区指正,以免产生误导,谢谢!)