刷 BUUCTF 记录 (持续更新)
- BJDCTF2020 (只记录比较有意思的题)
Mark loves cat
.git泄露,但是我是没扫到,从别人哪里嫖来的源码
1 <?php
2
3 include 'flag.php';
4
5 $yds = "dog";
6 $is = "cat";
7 $handsome = 'yds';
8
9 foreach($_POST as $x => $y){
10 $$x = $y;
11 }
12
13 foreach($_GET as $x => $y){
14 $$x = $$y; //存在变量覆盖漏洞
15 }
16
17 foreach($_GET as $x => $y){
18 if($_GET['flag'] === $x && $x !== 'flag'){
19 exit($handsome);
20 }
21 }
22
23 if(!isset($_GET['flag']) && !isset($_POST['flag'])){
24 exit($yds);
25 }
26
27 if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
28 exit($is);
29 }
漏洞点在14行, ’$$x=$$y‘ 存在变量覆盖漏洞。覆盖原理 比如 传入 is=flag 则会变成$is=$flag,这样就把flag的值覆盖到is上了。
有以下几种payload
1) get: ?is=flag&flag=flag post:什么也别传
根据最后一个if
先用flag变量覆盖is,然后再传入 flag=flag 则就输出了is 也就输出了flag
注意 这里 如果 get: ?is=flag post: flag=flag 是不行的,因为 post传入flag=flag过后 ,当前页面会创建一个变量$flag='flag' 最后就输出flag而不是真正的flag
2)get: ?yds=flag post:什么也不传
这是根据倒数第二个if
我们覆盖了yds,并且get和post都没传入flag,则输出yds,也就输出了flag
EzPHP
这道题学到很多东西
1)$_SERVER['QUERY_STRING'] 的正则绕过
知识点:
1.$_SERVER['query_string']
原文链接 http://blog.sina.com.cn/s/blog_686999de0100jgda.html 1,http://localhost/aaa/ (打开aaa中的index.php) 结果: $_SERVER['QUERY_STRING'] = ""; $_SERVER['REQUEST_URI'] = "/aaa/"; $_SERVER['SCRIPT_NAME'] = "/aaa/index.php"; $_SERVER['PHP_SELF'] = "/aaa/index.php"; 2,http://localhost/aaa/?p=222 (附带查询) 结果: $_SERVER['QUERY_STRING'] = "p=222"; $_SERVER['REQUEST_URI'] = "/aaa/?p=222"; $_SERVER['SCRIPT_NAME'] = "/aaa/index.php"; $_SERVER['PHP_SELF'] = "/aaa/index.php"; 3,http://localhost/aaa/index.php?p=222&q=333 结果: $_SERVER['QUERY_STRING'] = "p=222&q=333"; $_SERVER['REQUEST_URI'] = "/aaa/index.php?p=222&q=333"; $_SERVER['SCRIPT_NAME'] = "/aaa/index.php"; $_SERVER['PHP_SELF'] = "/aaa/index.php"; 由实例可知: $_SERVER["QUERY_STRING"] 获取查询 语句,实例中可知,获取的是?后面的值 $_SERVER["REQUEST_URI"] 获取 http://localhost 后面的值,包括/ $_SERVER["SCRIPT_NAME"] 获取当前脚本的路径,如:index.php $_SERVER["PHP_SELF"] 当前正在执行脚本的文件名
2.由于$_SERVER['QUERY_STRING']
不会进行URLDecode,而$_GET[]
会,所以只要进行url编码即可绕过:
payload: ?a=%73%68%65%6C%6C
2)正则匹配之 %0a污染
payload: ?debu=aqua_is_cute%0a
$_REQUEST
同时接受GET和POST的数据,并且POST具有更高的优先值
这个优先级是由php的配置文件决定的,默认应该是post,因为我自己的电脑上并没有做过任何设定,但是post是先于get的,
3)data://为协议
第二个if之前处理的办法一直都是 php://input, 但是这里 需要我们post 一个debu的值来绕过正则,所以这里就只能用data://
data为协议的使用方法
data://text/plain,<?php phpinfo()?> data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
和 php://input 一样 可以配合文件包含漏洞进行rce
payload:
4)sha1绕过
这个点遇到好多次了,数组绕过,这里值得注意的而是 extract() 函数会造成变量覆盖
5)create_function()代码注入
如此代码
实际上这段代码的含义就和这段代码一致
但是这里我又构造了如下代码
攻击是失败的,不知道是不是我的方式不对,这里我进行了很多次尝试都失败了。但是如果代码完全可控,我们是可以进行注入的,例如
可以看到传入 phpinfo();无回显,但是如果我们传入 }phpinfo();//
这是因为此时我们注入的语句在函数之外,这样即使我们没有调用该函数,也会执行我们注入的语句。
6)get_defined_vars();
按照预期解的那种方法,这里 包含了 flag.php 就可以用get_defined_vars()获取到全部的变量
最后就是来解这道题了,有好几种解法,搞了很久心态崩了,后来发现是再换了平台过后文件名变了,心态有点蹦,这里给两个师傅的参考网址
1.https://blog.****.net/a3320315/article/details/104111260
2.https://www.gem-love.com/ctf/770.html
最后一个解题小总结:
- 可以用 & | ^ ~ 运算来绕过字符过滤 // 这个实在是太重要了,这里的几个非预期都是值得学习与参考的地方,可以执行代码但是被过滤很多关键字与字符,可以用这几个运算绕过,但是这道题只用到了 ~运算 与 ^运算,得找个时间彻底研究一下吧
Cookie is so stable
又是模板注入,参考文章:https://zhuanlan.zhihu.com/p/28823933
EasySearch
知识点
- MD5碰撞
import hashlib for i in range(1,10000000000): a = hashlib.md5(str(i).encode('utf-8')).hexdigest() if a[0:6] == '6d0bc1': print(a) print(i) break
- ssl注入
参考文章:1.https://blog.****.net/qq_40657585/article/details/84260844