Exp8 Web基礎
目錄
-
- 實驗内容
- 建站過程
- Web前端:HTML基礎
- 資料庫:MySQL基礎
- Web背景:PHP基礎
- SQL注入
- 建站過程
- 知識點
- 實驗内容
實驗環境
- 主機
Kali
- 靶機
Kali
實驗工具
- 背景語言 'PHP'
- 伺服器 'Apache'
- 資料庫 'Mysql'
本次實驗,利用Kali内的Apache伺服器建站
首先,利用
root@Kali:~# sudo apt-get install apache2
- 下載下傳安裝apache
root@Kali:~# apachectl start
- 打開Apache服務
2017-2018 Exp8 Web基礎 20155214
root@Kali:~# netstat -aptn
- 檢視一下端口占用
root@Kali:~# cd var/www/html
- 找到Apache的工作目錄,之後需要在該目錄下建立一個前端頁面login.html。
具體代碼見知識點
<meta charset="UTF-8"> //設定頁面編碼格式,可以解決亂碼情況
···
<form method ="POST" action="login_controller.php" name="loginform" > //表單屬性,表單名稱loginform,通過POST傳輸到背景,調用login_controller.php這一背景檔案
···
<td>
<input type="text" name="username" value="Your name" size="20" maxlength="20" onfocus="if (this.value=='Your name') this.value='';" />
//文本框,名稱username,長度為20,預設值為Your name,當為預設值時,送出null。
</td>
···
<td>
<input type="password" name="password" value="Your password" size="20" maxlength="20" onfocus="if (this.value=='Your password') this.value='';" />
//密碼框,名稱為password,長度為20,預設值為Your password,當為預設值時,送出null。
</td>
···
<script language="javascript"> //js腳本,通過onclick()調用
function validateLogin(){
var sUserName = document.loginform.username.value ;
var sPassword = document.loginform.password.value ;
//擷取表單中使用者名密碼值
if ((sUserName =="") || (sUserName=="Your name")){
alert("請輸入使用者名!");
return false ;
}
if ((sPassword =="") || (sPassword=="Your password")){
alert("請輸入密碼!");
return false ;
}
//判斷為空,彈出alert提示
}
</script>
- 效果如下
2017-2018 Exp8 Web基礎 20155214
- 為了能夠儲存使用者名密碼,我們需要建立一個賬号資料庫。
root@Kali:~# /etc/init.d/mysql start
- 打開Kali的mysql服務
root@Kali:~# mysql -u root -p
- 登入mysql,預設密碼為
p@ssw0rd
MariaDB [(none)]> use mysql //使用mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MariaDB [mysql]> update user set password=PASSWORD("密碼") where user='root';//更新使用者密碼
MariaDB [mysql]> flush privileges;//提權
Query OK, 0 rows affected (0.00 sec)
MariaDB [mysql]> quit//退出後重新登入
- 設定mysql
MariaDB [mysql]> create database exp8_login_db;
//建立一個資料庫
Query OK, 1 row affected (0.01 sec)
MariaDB [mysql]> use exp8_login_db;
Database changed
MariaDB [exp8_login_db]> create table exp8_login_table (login_username VARCHAR(20),login_pwd VARCHAR(20));
Query OK, 0 rows affected (0.04 sec)
//建立一個資料表并設定字段
MariaDB [exp8_login_db]> show tables;
+-------------------------+
| Tables_in_exp8_login_db |
+-------------------------+
| exp8_login_table |
+-------------------------+
- 需要建立一個資料庫,在建立一張資料表,表中有賬号,密碼字段
MariaDB [exp8_login_db]> insert into exp8_login_table values('admin','test1234');//插入一條資料
Query OK, 1 row affected (0.01 sec)
MariaDB [exp8_login_db]> select * from exp8_login_table;
+----------------+-----------+
| login_username | login_pwd |
+----------------+-----------+
| admin | test1234 |
+----------------+-----------+
1 row in set (0.00 sec)
- 為網站提供一對賬号,密碼。
- 有了前端頁面,資料庫之後,我們需要用PHP語言寫一個背景,用以處理接受到的前端資料,并連結資料庫,比對前端接受的賬号密碼與資料庫中是否比對。
- 在/var/www/html目錄下建立一個PHP檔案
login_controller.php
$uname=($_POST["username"]);
$pwd=($_POST["password"]);
echo $uname;
echo $pwd;
- 用POST方法擷取前端username,password并儲存在變量中,可以用echo檢視傳回值。
- 這裡注意前背景方法必須相同,否則接收不到資料。
GET 和 POST 被視作 $_GET 和 $_POST。它們是超全局變量,這意味着對它們的通路無需考慮作用域 - 無需任何特殊代碼,您能夠從任何函數、類或檔案通路它們。
- $_GET 是通過 URL 參數傳遞到目前腳本的變量數組。
- $_POST 是通過 HTTP POST 傳遞到目前腳本的變量數組。
何時使用 GET?
通過 GET 方法從表單發送的資訊對任何人都是可見的(所有變量名和值都顯示在 URL 中)。GET 對所發送資訊的數量也有限制。限制在大于 2000 個字元。不過,由于變量顯示在 URL 中,把頁面添加到書簽中也更為友善。
GET 可用于發送非敏感的資料。
注釋:絕不能使用 GET 來發送密碼或其他敏感資訊!
何時使用 POST?
通過 POST 方法從表單發送的資訊對其他人是不可見的(所有名稱/值會被嵌入 HTTP 請求的主體中),并且對所發送資訊的數量也無限制。
此外 POST 支援高階功能,比如在向伺服器上傳檔案時進行 multi-part 二進制輸入。
不過,由于變量未顯示在 URL 中,也就無法将頁面添加到書簽。
提示:開發者偏愛 POST 來發送表單資料。
$query_str=
"SELECT * FROM exp8_login_table where login_username='{$uname}' and login_pwd='{$pwd}';";
- 設計一條SQL語句,查詢對應賬号密碼的資料
$con = mysql_connect("localhost:3306","root","toor");
mysql_select_db("exp8_login_db", $con);
- 連結本地資料庫,依次是
,位址
賬号
,并選擇密碼
。資料庫
if ($result = $mysql_query($query_str)) {
if ($result->num_rows > 0 ){
echo "<br> Wellcome login Mr/Mrs:{$uname} <br> ";
} else {
echo "<br> login failed!!!! <br> " ;
}
- 接受資料庫傳回查詢結果,非零則傳回登陸成功,否則登入失敗。
由于php缺少mysql擴充子產品,最終背景連接配接mysql失敗。
Tip: 這邊利用一下之前寫的java網站,嘗試注入![]()
2017-2018 Exp8 Web基礎 20155214
1.在使用者名輸入框中輸入' or 1=1#,密碼随便輸入,這時候的合成後的SQL查詢語句為select * from lxmtable where username='' or 1=1#' and password='',#相當于注釋符,會把後面的内容都注釋掉,而1=1是永真式,是以這個條件肯定恒成立,是以能夠成功登陸:
并沒有成功,原因其實很簡單,因為登入的賬号類型是數字,而注入的是字元串,造成了錯誤抛出。![]()
2017-2018 Exp8 Web基礎 20155214
2.sqlmap攻擊
(1)判斷目前使用者是否是dba: ./sqlmap.py -u "url" --is-dba -v 1
(2)列出資料庫管理系統使用者:./sqlmap.py -u "url" --users -v 0
(3)資料庫使用者密碼(hash):
./sqlmap.py -u "url" --passwords -v 0
./sqlmap.py -u "url" --passwords -U sa -v 0
(4)檢視使用者權限:
./sqlmap.py -u "url" --privileges -v 0
./sqlmap.py -u "url" --privileges -U postgres -v 0
(5)列出資料庫:
./sqlmap.py -u "url" --dbs -v 0
(6)列出資料庫表:
./sqlmap.py -u "url" --tables -D "information_scheam"
(7)列出表中的列名:
./sqlmap.py -u "url" --columns -T "user" -D "mysql" -v 1
(8)列出指定列的内容:
./sqlmap.py -u "url" --dump -T "users" -D "testdb" -C “指定字段”
找到自己的注入點
mybatis的mapper中getUsers函數
但是注入被過濾了,通過背景可以看到sqlmap的字典注入字段,以及背景的抛出日志。
1.前端HTML檔案
login.html
<html>
<head>
<meta charset="UTF-8">
<title>test</title>
</head>
<body>
<table>
<form method ="POST" action="login_controller.php" name="loginform" >
<tr>
<td>使用者名:</td>
<td><input type="text" name="username" value="Your name" size="20" maxlength="20" onfocus="if (this.value=='Your name') this.value='';" /></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>密 碼:</td>
<td><input type="password" name="password" value="Your password" size="20" maxlength="20" onfocus="if (this.value=='Your password') this.value='';" /></td>
<td> </td>
<td> </td>
</tr>
<tr>
<td><input type="checkbox" name="zlogin" value="1">自動登入</td>
</tr>
<table>
<tr>
<td><input type="submit" name="login" value="登入" onClick="return validateLogin()"/></td>
<td><input type="reset" name="rs" value="重置" /></td>
</tr>
</table>
</form>
</table>
<script language="javascript">
function validateLogin(){
var sUserName = document.loginform.username.value ;
var sPassword = document.loginform.password.value ;
if ((sUserName =="") || (sUserName=="Your name")){
alert("請輸入使用者名!");
return false ;
}
if ((sPassword =="") || (sPassword=="Your password")){
alert("請輸入密碼!");
return false ;
}
}
</script>
</body>
</html>
2.背景檔案login_controller.php
<?php
$uname=($_POST["username"]);
$pwd=($_POST["password"]);
echo "<br>$uname<br>";
echo "<br>$pwd<br>";
$query_str="SELECT * FROM exp8_login_table where login_username='{$uname}' and login_pwd='{$pwd}';";
$con = mysql_connect("localhost:3306","root","toor");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
echo "connect ok!";
mysql_select_db("exp8_login_db", $con);
/* Select queries return a resultset */
if ($result = mysql_query($query_str)) {
if ($result->num_rows > 0 ){
echo "<br> Wellcome login Mr/Mrs:{$uname} <br> ";
} else {
echo "<br> login failed!!!! <br> " ;
}
/* free result set */
$result->close();
}
mysql_close($con);
?>