Less-1 sql注入
- 利用单引号闭合,--+注释后面的内容,实现sql注入(urlcode编码会自动把+号转换为空格,如果要使用+号,则使用%)
- Order by排序,用二分法,确定表格的列数
第四列的排序的时候报错,第三列正确显示
- 联合查询,先查询数据库,再利用information_schema数据库查询表名和列名。
前面条件为真,则后面不执行。前面条件为假,后面才执行。
- 最后根据得到的数据库、表名、列名查询数据。
Less-5 get请求 布尔盲注 或者 报错注入
根据输入正确和错误的参数显示不同的页面信息。
当输入正确是显示”You are in”,可以截取想要查询的信息的一个字符的ascii码与某个值比较,可以得到正确和错误两种答案,将想要查询的信息的字符全部遍历完就可得到想要查询的信息的全部内容。
用and符连接,两个条件为真,则结果为真,否则为否
后续步骤,同第一关的思路一样,只需将database()换成想要查询的表名和列名。
报错注入,页面会显示报错点
原理:updatexml的第二个参数的格式不能包含’~’(~的url编码为0x7e),如果包含会报错
Less-9 时间盲注
与布尔盲注不同的是,输入正确和错误的参数会显示相同的页面信息。
所以我们要先办法创建一个条件,输入正确和错误的参数有不同的响应结果。
这里我们可以利用时间,请求成功利用sleep函数睡眠一秒,请求成功则没用响应
使用if(),三元判断
后续步骤,同第一关的思路一样,只需将database()换成想要查询的表名和列名。
Less-11 post注入
思路和第一关一样,没有任何过滤,只是请求方式发生了变化
aa' union select 1, database()#
aa' union select 1, group_concat(table_name) from information_schema.tables where table_schema='security'#
Less-15 post请求 布尔盲注
与Less-5相似,只是请求方式发生了变化
注意点:这里passwd字段也要传值,否则数据提交不了
Less-17
这里对uname使用了mysqli_real_escape_string过滤,但passwd没有过滤
审计代码
,可以使用报错注入或布尔注入
mysqli_real_escape_string函数
需要进行转义的字符串。
会被进行转义的字符包括:NUL (ASCII 0)、 \n、\r、\、 '、" 和 CTRL+Z。
这里可以使用,count(),floor(),rand(),group by,这四个函数造成主键冲突的报错
1' and (select 1 from (select count(*), concat(database(),floor(rand(0)*2)) as x from information_schema.tables group by x) as a)#
Less-18 User-Agent头部注入,或者X-Forwarded-For头部注入
uname和passwd都被mysqli_real_escape_string函数过滤了,无法闭合
但$uagent并没有被过滤,可以通过Burpsuite抓包工具,修改User-Agent的值实现注入
---这里还用用到报错注入
X-Forwarded-For头部注入与上述相同
Less-20 Cookie注入
与Less-18相似都要用到Burp suite和报错注入
Cookie: uname=admin1' and updatexml(1,concat(0x7e,(select database()),0x7e),1)#
Less-21 Cookie注入+base64编码
与Less-20相比只是多了一个base64编码,实用工具将Cookie注入的值编码就ok了
Less-24 二次注入
注册的时候有mysqli_real_escape_string函数过滤,但转义字符’\’再入数据库是会自动丢弃掉,所以数据库存储的用户名是:admin1’#
密码修改的时候,并没有过滤,而是直接从SESSION取出来的。修改admin1’#的密码入库时,把后面的内容注释了,就相当于修改了admin1的密码