刷 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.csdn.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.csdn.net/qq_40657585/article/details/84260844

                  2.https://www.cnblogs.com/yuzly/p/11226439.html

原文地址:https://www.cnblogs.com/tlbjiayou/p/12564440.html