6.6 Day2 究竟如何通过报错准确判断出SQL语句的闭合方式

在学习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上看到了一位大佬发的文章,链接如下:

SQL注入原理及如何判断闭合符

有所启发,看了大佬发的文章后,我对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\

(以上内容仅为个人观点和推测,若有不对请大佬评论区指正,以免产生误导,谢谢!)

  • 30
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值