這道題目是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)
?原文鏈接:
CTF網絡安全大賽web題目:just_sqli - 紅客網-網絡安全與滲透技術