1. 程式人生 > >NCTF SQL注入1

NCTF SQL注入1

在這裡插入圖片描述

原始碼:

<html>
<head>
Secure Web Login
</head>
<body>
<?php
if($_POST[user] && $_POST[pass]) {
mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
mysql_select_db(SAE_MYSQL_DB);
$user = trim($_POST[user]);
$pass = md5(trim($_POST[pass]));
$sql="select user from ctf where (user='".$user."') and (pw='".$pass."')";
echo '</br>'.$sql;
$query = mysql_fetch_array(mysql_query($sql));
if($query[user]=="admin") {
echo "<p>Logged in! flag:******************** </p>";
}
if($query[user] != "admin") {
echo("<p>You are not admin!</p>");
}
}
echo $query[user];
?>
<form method=post action=index.php>
<input type=text name=user value="Username">
<input type=password name=pass value="Password">
<input type=submit>
</form>
</body>
<a href="index.phps">Source</a>
</html>

關鍵: 在這裡插入圖片描述 以post方式提交user和pass 在這裡插入圖片描述

當user=admin&pass=pass時,SQL語句如下:select user from cft where (user=‘admin’) and (pw=‘pass’),查詢當user=admin和pw=pass時的user,user和pw在資料庫中 【從下面的圖回看,只知道user=admin,不知道pw的值時,where條件滿足不了,這條SQL查詢是查不到的,意味著下面的query=...if滿query =...為空,if無法滿足】 補充:關於query :

https://zhidao.baidu.com/question/983573447239383259.html 在這裡插入圖片描述

當執行的SQL查詢的user為admin時,顯示flag,有個關鍵在SQL查詢能不能執行,看回上面第二幅圖

解題思路:通過post提交方式 user與pass,而且提交的user必須是admin.但是密碼不知道。所以就得在sql=and(pw=&quot;.sql=這句想辦法繞過and (pw=&#x27;&quot;.pass."’) 這段 ,所以構造的語句就是這樣語句:Username=admin ‘)# 實際執行的SQL語句:select user from cft where (user=‘admin ‘)#’) and (pw=‘pass’),#後的都被註釋掉了,兩個if都滿足了

總結:並不是通過閉合直接查詢資料庫中的使用者名稱和密碼,而是使顯示flag的兩個if語句執行。 要想拿到flag,要滿足兩個if,第一個if要求有user和pass的post輸入,第二個if要求$query查詢的user為admin