这道题目是bugku的web题目
题目的 描 述: KosenCTF{}
原文链接: CTF网络安全大赛web题目:just_sqli - 红客网-网络安全与渗透技术
题目Web源代码:
<?php
$user = NULL;
$is_admin = 0;
if (isset($_GET["source"])) {
highlight_file(__FILE__);
exit;
}
if (isset($_POST["username"]) && isset($_POST["password"])) {
$username = $_POST["username"];
$password = $_POST["password"];
$db = new PDO("sqlite:../database.db");
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
$db->exec("CREATE TABLE IF NOT EXISTS users (username TEXT UNIQUE, password TEXT, is_admin BOOL);");
$q = "username, is_admin FROM users WHERE username = '$username' AND password = '$password'";
if (preg_match("/SELECT/i", $q)) {
throw new Exception("only select is a forbidden word");
}
$rows = $db->query("SELECT " . $q, PDO::FETCH_ASSOC);
foreach ($rows as $row) {
$user = $row["username"];
$is_admin = $row["is_admin"];
}
}
catch (Exception $e) {
exit("EXCEPTION!");
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Just SQLi</title>
</head>
<body>
<h1>Just SQLi</h1>
<div><a href="?source=1">view source</a>
<?php if ($user) { ?>
<div>Nice Login <?= $user ?></div>
<?php if ($is_admin) { ?>
<div>And Nice to Get the Admin Permission!</div>
<div> <?= include("../flag.php"); ?></div>
<?php } ?>
<?php } ?>
<form action="" method="POST">
<div>username: <input type="text" name="username" required></div>
<div>password: <input type="text" name="password" required></div>
<div>
<input type="submit" value="Login">
</div>
</form>
</body>
</html>
从给定的PHP代码中,有几个关键的安全问题可以被利用来进行SQL注入。但首先,需要注意的是代码中尝试使用preg_match
来防止"SELECT"关键词的使用,然而这种尝试是无效的,因为它并没有在构造完整的SQL查询时应用此检查。
下面是一个可能的SQL注入攻击步骤,来绕过身份验证并获取管理员权限:
原文链接: CTF网络安全大赛web题目:just_sqli - 红客网-网络安全与渗透技术
- 用户名注入 :由于用户名和密码直接插入到SQL查询中,我们可以尝试在用户名字段中注入SQL代码。但是,由于
preg_match
检查,我们不能直接包含"SELECT"。但我们可以尝试其他方法,如注释掉原查询的剩余部分。 - 构造注入语句 :在用户名字段中,我们可以尝试使用SQL注释(
--
在SQLite中是有效的)来截断原始查询的其余部分,并附加我们自己的查询条件。由于代码尝试直接构造一个片段并添加到SELECT
查询中,我们可以利用这一点。 - 绕过
preg_match
:由于preg_match
只检查$q
变量(这只是一个片段,不是完整的SQL查询),我们可以构造一个不包含"SELECT"的片段,但在实际执行时,它将成为完整的SELECT
查询的一部分。
下面是一个可能的注入攻击示例(请注意,这只是一个示例,实际情况可能有所不同):
在用户名字段中输入:
' OR '1'='1' --
在密码字段中输入任意值(例如"password123")。
提交表单后,生成的SQL查询将是:
SELECT username, is_admin FROM users WHERE username = '' OR '1'='1' --' AND password = 'password123'
由于--
是SQL注释,所以查询的剩余部分(包括密码验证部分)将被忽略。这样,查询将返回表中的所有用户,无论他们的密码是什么。
然而,为了获取管理员权限,我们可能还需要进一步利用其他漏洞或尝试其他注入方法,因为此查询仅返回用户名和is_admin
字段,而不直接修改它们。
但请注意,这种攻击是违法的,并且只应在法律允许和道德接受的环境(如安全培训或测试环境)中进行。在实际环境中尝试此类攻击可能导致法律责任和其他后果。
原文链接: CTF网络安全大赛web题目:just_sqli - 红客网-网络安全与渗透技术
我们开始对这个题目进行sql注入吧
一开始我们先盲注,构造查询语句
admin'or 1=1 --
发现行不通
接着我们开始联合查询
admin'union select 1,2#
发现还是不行
看了下代码, preg_match("/SELECT/i", $q 这个对select进行了处理。
接着我们开始下一个方法就是用values进行替换select就行了
admin'union values('password',1) --
也是成功拿到答案
红客网(blog.hongkewang.cn)