BUU CTF Learn 4

[GWCTF 2019]枯燥的抽奖

考点:
伪随机数

解题:

给了一个随机数

我们了解知识后,知道这其实是伪随机数:就是种子如果不变,在相同的php版本下随机数不变。

在源码中发现check.php

进入发现源码

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?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工具爆破种子

1
2
3
4
5
6
7
8
9
<?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;

 

漏洞成因:

  • 使用mysqli_multi_query()这种支持多语句执行的函数
  • 使用PDO的方式进行数据查询,创建PDO实例时PDO::MYSQL_ATTR_MULTI_STATEMENTS设置为true时,可以执行多语句

 

[强网杯 2019]Upload

打开后是一个登录页面,注册后登陆

是一个上传头像页面

上传任何php文件都不可以,尝试了各种姿势无果后放弃

扫目录后发现源码泄露www.tar.gz 发现有24M的源码。

吓死了

先放一放(审计源码未来看,本题放一下)

 

[SUCTF 2019]EasyWeb

打开即源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?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

发表评论

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