天天看點

2017-2018 Exp8 Web基礎 20155214

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
2017-2018 Exp8 Web基礎 20155214

  • 為了能夠儲存使用者名密碼,我們需要建立一個賬号資料庫。
root@Kali:~# /etc/init.d/mysql start
           
  • 打開Kali的mysql服務
root@Kali:~# mysql -u root -p
           
2017-2018 Exp8 Web基礎 20155214
  • 登入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//退出後重新登入

           
2017-2018 Exp8 Web基礎 20155214
  • 設定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        |
+-------------------------+

           
2017-2018 Exp8 Web基礎 20155214
  • 需要建立一個資料庫,在建立一張資料表,表中有賬号,密碼字段
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)

           
2017-2018 Exp8 Web基礎 20155214
  • 為網站提供一對賬号,密碼。

  • 有了前端頁面,資料庫之後,我們需要用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
并沒有成功,原因其實很簡單,因為登入的賬号類型是數字,而注入的是字元串,造成了錯誤抛出。
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函數

2017-2018 Exp8 Web基礎 20155214

但是注入被過濾了,通過背景可以看到sqlmap的字典注入字段,以及背景的抛出日志。

2017-2018 Exp8 Web基礎 20155214

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);

?>