hgameCTF之PHP trick
Ebounce
撰写于 2019年 02月 22 日

做了一下Hgame2019的CTF,由于后面涉及写脚本问题,暂时只能动到第二周的题,这道题我感觉收获最大。
<!--more-->
就是PHP trick这道题,我们先看源码,如下图:

然后按照这个题给的意思应该是需要我们绕过这层层过滤,去访问admin.php。(PS:我尝试了直接访问,提示需要本地访问--localhost,然后用burpsuite改了并没有什么用)
所以先来看看给出的源码,所有参数都是通过GET方法来获取的,这样我们直接使用hackbar就可以了

第一二个if的绕过


先看第一个if要求str1和str2不相等,这个可以轻易绕过,主要
就是第二个if要求str1和str2的MD5值相等,注意是"=!"也就是弱相等,因此我们可以构造md5值为0e开头的,php在读入X(X是数字)e开头的字符会理解为X的多少次方,
因此0E开头,可以理解为0的多少次方,我们知道0^n无论如何还是0,所以就能够绕过第二个if了。
这里构造参数

str1=s878926199a str2=s155964671a

第三四个if的绕过


我们看到第三个if仍然是相同的套路,但这时MD5值得校验已经变成了强相等,这时候不能再用之前得方法绕过了,我们可以用数组进行绕过,由于如果在MD5里面传入
数组的话,那么MD5函数会返回一个NULL,由于两边都是NULL,所以就可以绕过这个强相等问题了。

str3[]=1 str4[]=2

因为这种写法会使php的参数变成error,而两个参数均为error转换为MD5后值一定相同。

第五六七个if绕过


$_SERVER["QUERY_STRING"]这个在PHP中等同于查询字符"?"后的所有字符,因此第五个if要求H_game字符不能在"?"后面出现,但由于$str5 = @$_GET['H_game'];
也就是说我们必须传入h_game参数,并且要是数字,而且不能满足后面两个if,即又要>=9999999999,转化为字符后又必须<=0。
一步一步来,先绕过校验H_game存在,这里可以利用URL编码进行绕过,轻轻松松。而后面两个if也可以用数组进行绕过
最后H_game参数就直接变成了

%48%5f%67%61%6d%65[]=%20

第八九十个if绕过


parse_url()函数是用于解析我们的URL并返回组成部分,这最后两个if就是校验我们的传入URL的协议名是否是http,然后域名是不是www.baidu.com,虽然能够直接传入这个值,但是后面
就会出现问题。如果我们直接传入

url=http://www.baidu.com

那么我们会发现下面出现了百度的界面

curl的处理


curl在这里相当于解析我们的url并进行访问,但注意curl的访问,相当于在服务器内部进行的访问,也就是说如果我们访问本地的文件,就相当于以localhost去访问本地
资源,因此要想办法让curl解析访问admin.php,这里就要利用URL的组成了,首先parse_url()在解析host时,会解析第二个@后面的内容,而CURL则会解析第一个@后的内容
有关curl是个啥
因此这里构造参数

url=http://@127.0.0.1:80@www.baidu.com/admin.php</pre></code>

便可以成功访问admin.php了,但不知道为什么直接用127.0.0.1不能直接访问需要加个80端口。

php伪协议读取


admin.php的源码如下:
这里要求传参为GET方法传入的参数filename,
并且会校验该文件是否存在,如果存在则会输出一段话,而不会读取,
而读取文件函数却是在文件不存在条件下才会执行,这里很显然不能直接读取,我们可以使用php伪协议的方法进行文件读取,
有关php伪协议的知识可以参照下文:
PHP伪协议
最后利用php://filter读取flag.php

filename=php://filter/read=convert.base64-encode/resource=flag.php


最后将这段base64解码就可以得到flag啦。

完整的payload如下图:

hgameCTF之PHP trick

做了一下Hgame2019的CTF,由于后面涉及写脚本问题,暂时只能动到第二周的题,这道题我感觉收获最大。
<!--more-->
就是PHP trick这道题,我们先看源码,如下图:

然后按照这个题给的意思应该是需要我们绕过这层层过滤,去访问admin.php。(PS:我尝试了直接访问,提示需要本地访问--localhost,然后用burpsuite改了并没有什么用)
所以先来看看给出的源码,所有参数都是通过GET方法来获取的,这样我们直接使用hackbar就可以了

第一二个if的绕过


先看第一个if要求str1和str2不相等,这个可以轻易绕过,主要
就是第二个if要求str1和str2的MD5值相等,注意是"=!"也就是弱相等,因此我们可以构造md5值为0e开头的,php在读入X(X是数字)e开头的字符会理解为X的多少次方,
因此0E开头,可以理解为0的多少次方,我们知道0^n无论如何还是0,所以就能够绕过第二个if了。
这里构造参数

str1=s878926199a str2=s155964671a

第三四个if的绕过


我们看到第三个if仍然是相同的套路,但这时MD5值得校验已经变成了强相等,这时候不能再用之前得方法绕过了,我们可以用数组进行绕过,由于如果在MD5里面传入
数组的话,那么MD5函数会返回一个NULL,由于两边都是NULL,所以就可以绕过这个强相等问题了。

str3[]=1 str4[]=2

因为这种写法会使php的参数变成error,而两个参数均为error转换为MD5后值一定相同。

第五六七个if绕过


$_SERVER["QUERY_STRING"]这个在PHP中等同于查询字符"?"后的所有字符,因此第五个if要求H_game字符不能在"?"后面出现,但由于$str5 = @$_GET['H_game'];
也就是说我们必须传入h_game参数,并且要是数字,而且不能满足后面两个if,即又要>=9999999999,转化为字符后又必须<=0。
一步一步来,先绕过校验H_game存在,这里可以利用URL编码进行绕过,轻轻松松。而后面两个if也可以用数组进行绕过
最后H_game参数就直接变成了

%48%5f%67%61%6d%65[]=%20

第八九十个if绕过


parse_url()函数是用于解析我们的URL并返回组成部分,这最后两个if就是校验我们的传入URL的协议名是否是http,然后域名是不是www.baidu.com,虽然能够直接传入这个值,但是后面
就会出现问题。如果我们直接传入

url=http://www.baidu.com

那么我们会发现下面出现了百度的界面

curl的处理


curl在这里相当于解析我们的url并进行访问,但注意curl的访问,相当于在服务器内部进行的访问,也就是说如果我们访问本地的文件,就相当于以localhost去访问本地
资源,因此要想办法让curl解析访问admin.php,这里就要利用URL的组成了,首先parse_url()在解析host时,会解析第二个@后面的内容,而CURL则会解析第一个@后的内容
有关curl是个啥
因此这里构造参数

url=http://@127.0.0.1:80@www.baidu.com/admin.php</pre></code>

便可以成功访问admin.php了,但不知道为什么直接用127.0.0.1不能直接访问需要加个80端口。

php伪协议读取


admin.php的源码如下:
这里要求传参为GET方法传入的参数filename,
并且会校验该文件是否存在,如果存在则会输出一段话,而不会读取,
而读取文件函数却是在文件不存在条件下才会执行,这里很显然不能直接读取,我们可以使用php伪协议的方法进行文件读取,
有关php伪协议的知识可以参照下文:
PHP伪协议
最后利用php://filter读取flag.php

filename=php://filter/read=convert.base64-encode/resource=flag.php


最后将这段base64解码就可以得到flag啦。

完整的payload如下图:

上一篇
没有了

评论区(暂无评论)

这里空空如也,快来评论吧~

我要评论