解讀SQL查詢結(jié)果集對(duì)注入的影響及利用_Mssql數(shù)據(jù)庫(kù)教程
推薦:解讀SQLServer 游標(biāo)簡(jiǎn)介與使用說(shuō)明游標(biāo)(Cursor)是處理數(shù)據(jù)的一種方法,為了查看或者處理結(jié)果集中的數(shù)據(jù),游標(biāo)提供了在結(jié)果集中一次以行或者多行前進(jìn)或向后瀏覽數(shù)據(jù)的能力。我們可以把游標(biāo)當(dāng)作一個(gè)指針,它可以指定結(jié)果中的任何位置,然后允許用戶對(duì)指定位置的數(shù)據(jù)進(jìn)行處理。 1.游標(biāo)的組成 游
對(duì)于注入而言,錯(cuò)誤提示是極其重要。所謂錯(cuò)誤提示是指和正確頁(yè)面不同的結(jié)果反饋,高手是很重視這個(gè)一點(diǎn)的,這對(duì)于注入點(diǎn)的精準(zhǔn)判斷至關(guān)重要。本問(wèn)討論下關(guān)于幾類錯(cuò)誤和他產(chǎn)生的原理,希望對(duì)讀者有所幫助。
錯(cuò)誤提示主要有邏輯錯(cuò)誤和語(yǔ)法錯(cuò)誤以及腳本運(yùn)行錯(cuò)誤三類。
一:邏輯錯(cuò)誤
簡(jiǎn)單的例子是1=1 1=2這兩個(gè),1=1與1=2頁(yè)面不同的原理是什么?以$sql = “select * from news where id=$_GET[id]”為例。
select * from news where id=1 and 1=2產(chǎn)生的結(jié)果集為NULL,然后程序取值得時(shí)候,就會(huì)去出空值,無(wú)法顯示。當(dāng)然有的程序發(fā)現(xiàn)SQL執(zhí)行結(jié)果集為空,就立即跳轉(zhuǎn),效果就不顯鳥(niǎo)。值得注意的是,有的如Oracle Postgresql的數(shù)據(jù)庫(kù)在結(jié)果集為空情況下會(huì)再頁(yè)面上表現(xiàn)字符型null字樣,這算是個(gè)特點(diǎn)。如果使用or條件,比如
select * from news where id=1 or 1=1
和and 1=2得結(jié)果正好相反,他的結(jié)果集十分龐大。如果SQL語(yǔ)句如此,再加上程序是循環(huán)讀取結(jié)果集(一些編程上的陋習(xí))那么會(huì)取出所有結(jié)果,結(jié)果可能運(yùn)行很慢,在數(shù)據(jù)量巨大的oracle上容易出現(xiàn)。這個(gè)例子會(huì)出現(xiàn)什么呢,一般程序取出結(jié)果集中的第一條結(jié)果,那么很可能已經(jīng)不是id=1的那條新聞了,這就是由些小菜奇怪有時(shí)候or 1=1頁(yè)面會(huì)發(fā)生變化的原因。
歸根到底,都是結(jié)果集不同造成的,靈活掌握是關(guān)鍵,這并非單純的經(jīng)驗(yàn)問(wèn)題。
二:語(yǔ)法錯(cuò)誤
語(yǔ)法錯(cuò)誤時(shí)比較熟悉的,比如對(duì)于SQL Server,PgSQL,Sybase的注入錯(cuò)誤提示都很重要,因?yàn)槔盟奶匦詠?lái)獲取信息很快速。語(yǔ)法錯(cuò)誤造成的結(jié)果可能是SQL錯(cuò)誤而中斷腳本執(zhí)行,但是腳本或服務(wù)器設(shè)置屏蔽錯(cuò)誤的情況下,程序得到繼續(xù)執(zhí)行,但是結(jié)果集不存在,連NULL都算不上,反饋給攻擊者的很可能就是結(jié)果集為空的情況,其實(shí)這是腳本的處理結(jié)果。當(dāng)然Oracle PgSQL表現(xiàn)null。
三:運(yùn)行錯(cuò)誤不用說(shuō)了,典型的就是利用mysql注入benchmark讓腳本運(yùn)行超時(shí)得到物理路徑,以及利用超時(shí)來(lái)獲得不同的表征進(jìn)行盲注入。
四:邏輯錯(cuò)誤和語(yǔ)法錯(cuò)誤的結(jié)合。
當(dāng)表征極不明顯的時(shí)候,利用類似iff這樣的函數(shù)進(jìn)行正確與否的區(qū)分有時(shí)候會(huì)成救命稻草。因?yàn)檎Z(yǔ)法錯(cuò)誤和邏輯錯(cuò)誤的表征大多數(shù)情況都會(huì)有不同。
iff(1=1,1,‘no’)這個(gè)會(huì)產(chǎn)生結(jié)果1 注意是數(shù)字,而iff(1=2,1,‘no’)這個(gè)會(huì)產(chǎn)生‘no’ 是字符。那么
id=1 and 1=iff(1=1,1‘no’)正確是必然成立的,而id=1 and 1=iff(1=2,1,‘no’)會(huì)因?yàn)轭愋筒煌l(fā)生語(yǔ)法錯(cuò)誤。不過(guò)可惜的是似乎支持iff函數(shù)的數(shù)據(jù)庫(kù)不多,呵呵。
現(xiàn)在講結(jié)果集在注入中的利用原理。
一:從‘or’‘=’開(kāi)始
這是學(xué)習(xí)SQL注入的初級(jí)課程,登陸漏洞。我簡(jiǎn)略從SQL結(jié)果集上分析。
$sql = “select top 1 * from admin where username=‘$username’ and password=md5(‘$password’)”;
顯而易見(jiàn),‘or’‘=’的加入使SQL語(yǔ)句返回了一條記錄,這才使驗(yàn)證通過(guò)。
二:再看現(xiàn)在的驗(yàn)證中的SQL
$sql = “select top 1 * from admin where username=‘$username’”;
結(jié)果集不為空才根據(jù)抽取的記錄集中的密碼值與用戶提交的密碼MD5值進(jìn)行比對(duì)來(lái)進(jìn)行驗(yàn)證。這樣,你突然發(fā)現(xiàn)‘or’‘=’的計(jì)策失敗鳥(niǎo),但是后臺(tái)明明有注入,這就是驗(yàn)證方法造成的。跟進(jìn)這個(gè)驗(yàn)證過(guò)程,‘or’‘=’的確產(chǎn)生了一個(gè)結(jié)果集(admin表中的第一行記錄)但是遺憾的事,后來(lái)的密碼比對(duì)沒(méi)法通過(guò),驗(yàn)證無(wú)法成功。
思路很簡(jiǎn)單,網(wǎng)上有案例,我重在原理,利用union來(lái)產(chǎn)生想要的結(jié)果集。比如‘and(1=2)union select top 1 username,’123456得md5值‘,id from admin where username=’admin
這樣產(chǎn)生了admin的記錄信息,但是記錄集中的密碼那個(gè)位置的值被替換成了123456的md5值,這樣,使用admin 123456通過(guò)驗(yàn)證并且繼承他的權(quán)利。
更有甚者全部用‘xxx’的方法來(lái)盲狙,這就很“過(guò)分”鳥(niǎo)。不過(guò)在sql2000 sybase這些嚴(yán)格要求類型匹配的數(shù)據(jù)庫(kù)來(lái)說(shuō),這樣不能撼動(dòng)“管理員登陸”的,因?yàn)閳?zhí)行時(shí)發(fā)生了語(yǔ)法錯(cuò)誤,結(jié)果集為NULL。另外以前ewebeditor注入漏洞來(lái)上傳馬也是這個(gè)union操作結(jié)果集來(lái)達(dá)到目的的經(jīng)典案例。
分享:揭秘在 SQL Server 數(shù)據(jù)庫(kù)開(kāi)發(fā)中的十大問(wèn)題在SQL Server中進(jìn)行開(kāi)發(fā)會(huì)讓你身處險(xiǎn)地,并且尋找快速解決方案。我們編輯了前十名關(guān)于SQL Server開(kāi)發(fā)的常見(jiàn)問(wèn)題。對(duì)常見(jiàn)的針對(duì)表和字段的名字約束進(jìn)行探究。學(xué)習(xí)如何解決并發(fā)問(wèn)題,并且在不了解T-SQL的情況下編寫(xiě)存儲(chǔ)過(guò)程。查看這些解決方案的快速參考,并且
- sql 語(yǔ)句練習(xí)與答案
- 深入C++ string.find()函數(shù)的用法總結(jié)
- SQL Server中刪除重復(fù)數(shù)據(jù)的幾個(gè)方法
- sql刪除重復(fù)數(shù)據(jù)的詳細(xì)方法
- SQL SERVER 2000安裝教程圖文詳解
- 使用sql server management studio 2008 無(wú)法查看數(shù)據(jù)庫(kù),提示 無(wú)法為該請(qǐng)求檢索數(shù)據(jù) 錯(cuò)誤916解決方法
- SQLServer日志清空語(yǔ)句(sql2000,sql2005,sql2008)
- Sql Server 2008完全卸載方法(其他版本類似)
- sql server 2008 不允許保存更改,您所做的更改要求刪除并重新創(chuàng)建以下表
- SQL Server 2008 清空刪除日志文件(瞬間日志變幾M)
- Win7系統(tǒng)安裝MySQL5.5.21圖解教程
- 將DataTable作為存儲(chǔ)過(guò)程參數(shù)的用法實(shí)例詳解
Mssql數(shù)據(jù)庫(kù)教程Rss訂閱編程教程搜索
Mssql數(shù)據(jù)庫(kù)教程推薦
- 怎樣讓SQL Server加速運(yùn)行
- 為何把你的數(shù)據(jù)庫(kù)置于版本控制之下
- SQL Server 2008 數(shù)據(jù)加載創(chuàng)世界記錄
- 解析應(yīng)對(duì)SQL Server數(shù)據(jù)庫(kù)崩潰的方法
- 淺談SQL server2000中char和varchar字符型數(shù)據(jù)類型的區(qū)別
- 解讀SQL Server查詢含有單引號(hào)數(shù)據(jù)的方法
- 解決Mysql服務(wù)無(wú)法啟動(dòng)的1067錯(cuò)誤
- 淺談SQL Server 2008數(shù)據(jù)挖掘查詢?nèi)蝿?wù)
- 解讀數(shù)據(jù)庫(kù)自動(dòng)化技術(shù)彌補(bǔ)數(shù)據(jù)庫(kù)DBA短缺難題
- 如何設(shè)定sql server定期自動(dòng)備份數(shù)據(jù)庫(kù)
猜你也喜歡看這些
- C# Mysql 查詢 Rownum的解決方法
- SQL查詢超時(shí)的設(shè)置方法(關(guān)于timeout的處理)
- 如何用workbench導(dǎo)出mysql數(shù)據(jù)庫(kù)關(guān)系圖
- linux下mysql提示mysql deamon failed to start錯(cuò)誤的解決方法
- 遠(yuǎn)程連接mysql數(shù)據(jù)庫(kù)注意點(diǎn)記錄
- 如何修改mysql數(shù)據(jù)庫(kù)的max_allowed_packet參數(shù)
- 綠色版mysql注冊(cè)卸載服務(wù)方法
- 基于ubuntu中使用mysql實(shí)現(xiàn)opensips用戶認(rèn)證的解決方法
- 使用java處理字符串公式運(yùn)算的方法
- Mysql兩種情況下更新字段中部分?jǐn)?shù)據(jù)的方法
- 相關(guān)鏈接:
- 教程說(shuō)明:
Mssql數(shù)據(jù)庫(kù)教程-解讀SQL查詢結(jié)果集對(duì)注入的影響及利用
。