sqli-labs练习-less23-27

由于校赛的wp已经出来了我就不写了,把sqli-labs的坑先给填了。

ps.整理了关于sqli-labs靶场的博客,将分散的几篇整合了起来。

less-23

刷了那么多花里胡哨的关卡,又回到了熟悉的GET顿时令人倍感亲切。不过原来的倍感亲切现在变得来势汹汹,我们发现关卡标题提示我们这关过滤了注释符“#”和“–”,我们先来查看源码:

1
2
3
4
5
$reg = "/#/";
$reg1 = "/--/";
$replace = "";
$id = preg_replace($reg, $replace, $id);
$id = preg_replace($reg1, $replace, $id);

这行代码的原理就是检测到id中存在注释符时使用空代替,因此平常的注释方法就失效了,不过我们还有其他的方法——闭合语句法。原来我们要使用注释符是因为我们手动加上了一个单引号导致源码中单引号无法匹配,因此使用注释符将后面的单引号注释掉。不过这个方法现在行不通了,那我们就换个思路,手动闭合单引号就可以了。

我们可以使用or'1或者or'1'='1来进行闭合,效果如下:

不过此处我们无法用单引号闭合在执行order by语句,由于order by之后需要使用数字,这里加入引号使数字转换成了字符串导致错误,我们在这里介绍另一个绕过方法,使用%00

具体原理可以参照下面这个链接,简单来说%00截断也就是0x00,系统在读取到0x00后就会停止继续读取,从而起到过滤后面单引号的作用:
0x00截断原理

不过既然是截断了,我们在构建注入语句时一定要记得加上分号,效果如下:

这样就解决了我们order by的使用问题,接下来就可以进行爆库了。

less-24

一道POST题,我们发现这道题就比较复杂了,页面中有很多选项,有忘记密码,有创建账户,原页面是登录。根据标题内容提示我们这关是双重注入,我们先介绍一下双重注入:

首先我们在http请求中提交一次恶意输入使其保存进数据库中,接着我们第二次提交http请求,为了响应这次的请求程序会检索数据库中的恶意输入,成功则会返回对应结果。

了解原理后,接下来我们来审查源码,首先是index.php,一上来就是这串代码:

1
2
3
4
session_start();
if (isset($_SESSION['username']) && isset($_COOKIE['Auth'])) {
header('Location: logged-in.php');
}

Session_start():开始一个会话或者返回已经存在的会话,session函数保证了cookie可以在多个页面中被应用。我们继续审查,会发现几乎每个POST点都被保护的很严密,除了pass_change.php;中的username参数是直接通过session传入的,这就意味着这里存在注入点。

那么我们首先创造一个账户,用户名为admin’#。注意,字符的转义是暂时的,不会影响存入数据库中的值。

为什么我们这里要取这个名字,我们来分析更改密码的update代码:
$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";

这里我们的username对应的值为admin’#,代入代码后我们得到的指令是这样的:
$sql = "UPDATE users SET PASSWORD='$pass' where username='admin'#' and password='$curr_pass' ";

一目了然,username中的单引号闭合了代码中的单引号,而#起到了过滤作用,使得我们无需验证原密码也可以进行改密,接着我们就可以把admin的密码进行更改了。

没错,之前写到的admin密码123456我就是在这关改的。最后我们更改密码并登陆admin,解题成功。

less-25&25a

这两关本质上是一样的,放一起讲。这关的提示文字都已经贴在我们脸上告诉我们除了注释符,and和or都不能用了。那么首先,23关的%00截断法在这关仍然适用,但如果这样那就和less-23没区别了,那我们换种方法。

这个替换的原理是检测到or或者and就替换成空格,那么我们可以套娃,套一个anandd或者oorr出来,系统过滤了其中的and和or后,我们还能剩下一个and和or,要注意,只要存在and和or,不管是在单词中还是单独的,我们都需要进行套娃,例如information我们就要写成infoorrmation。

除此之外,将URL进行编码也是可以的,URL编码直接使用burp suite就可以了。如果是单独的and和or的话,我们也可以用&&和||替换,网上说大小写变形可以注入,但我测试了是不行的,查看源码也是说不区分大小写。

25a由于没有回显,因此使用盲注就可以了。

less-26&26a

现在这关向着不做人更进一步,空格也给过滤掉了,不过问题也不大,对空格的过滤我们有一套完整的解决方案:

  • 特殊字符(%号家族):包括但不限于%20 %09 %0a %0b %0c %0d %a0
  • 注释:/**/
  • 使用括号,记得要闭合每个括号

常用的方法就是以上三者,这里使用括号来做示范:
http://127.0.0.1/Less-26/?id=1%27oorr(extractvalue(1,concat(0x7e,(database()),0x7e)))aandnd%20%271%27=%271

用联合注入当然也可以。要注意,注释方法也被过滤了,而特殊字符在windows中可能出现无法被替换成空格的问题,因此在windows下建议使用括号进行绕过。

26a中采用的过滤方式为单引号+括号,且关闭了错误回显,因此只能使用盲注,具体情况和26关一样。

less-27&27a

这关就没有过滤and和or了,但是我们失去了union和select,同时我们发现有些过滤语句后面的反斜杠上有m或s,这是什么意思呢,这是设定的修正符,修正符的具体效果参照下面这个链接:
正则表达式中的修正符

不过我们发现这里的union select可以使用混合大小写来绕过,而且源码中的正则表达式意味着只要含有就会被过滤,套娃方法在这关就失效了。同时这关的负号也被过滤了,因此id值应该GET一个例如999的数。最后进行爆库就行了。当然报错与盲注一样都是可以的。

27a同样是没有报错,与27没有什么差别,盲注就行了。