二進位制SQL注入漏洞分析

2022-04-29 05:00:07 字數 4085 閱讀 3738

摘自:

發現**中並無出奇, 只是將幾年前的冷飯再炒.因為多年過去了, 可能有人疏忽, 多試一些總有人中招的.

注入方式中數字欄位是最容易進入的. 文字也可以, 但在querystring中提交文字的情況不如數字多.

最常見的就是形如 news.asp?id=3

在asp中,疏忽的寫法為

aspid=request("id")

sql="select * from news where id=" & aspid

set rs=conn.exec(sql)

這裡的id完全沒有保護, 如果id是乙個字串, 很容易就注入了

例如id=3;delete%20from%20news;

直接刪除news表記錄

對於文字來說, 例如news.asp?keyword=abc

aspkeyword=request("keyword")

sql="select * from news where title like '%" &aspkeyword& "%'

注入時就用在keyword裡用單引號封住, 最後再寫一句假的sql來騙原**.

例如 keyword=abc';delete from news;select * from sysobject where something like '%

相比id當然就麻煩的多.

下面的內容中的一大堆**, 其實是為了避開防注入程式中限制的一些關鍵字.

看了幾個防注入程式, 一般是通過過濾的方法, 例如

sql_injdata = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|daxia123|''') 

fetch next from table_cursor into @t,@c end close table_cursor deallocate table_cursor

修復** by 水上飛雲@

注:對ntext,text 無效

/***********定義要去除的字元,請注意,

可能不止一條,我的伺服器就查到兩條************/

declare @delstr nvarchar(500)

set @delstr=''

/**********以下為操作實體************/

set nocount on

declare @tablename nvarchar(100),@columnname nvarchar(100),@tbid

int,@irow int,@iresult int

declare @sql nvarchar(500)

set @iresult=0

declare cur cursor for

select name,id from sysobjects where xtype='u'

open cur

fetch next from cur into @tablename,@tbid

while @@fetch_status=0

begin

declare cur1 cursor for

--xtype in (231,167,239,175) 為char,varchar,nchar,nvarchar型別

select name from syscolumns where xtype in (231,167,239,175)

and id=@tbid

open cur1

fetch next from cur1 into @columnname

while @@fetch_status=0

begin

set @sql='update [' + @tablename + '] set ['+ @columnname +']=

replace(['+@columnname+'],'''+@delstr+''','''') where

['+@columnname+'] like ''%'+@delstr+'%'''

exec sp_executesql @sql

set @irow=@@rowcount

set @iresult=@iresult+@irow

if @irow>0

begin

print 'table: '+@tablename+', column:'+@columnname+' has been

updated with '+convert(varchar(10),@irow)+' record(s);'

endfetch next from cur1 into @columnname

endclose cur1

deallocate cur1

fetch next from cur into @tablename,@tbid

endprint 'the database has '+convert(varchar(10),@iresult)+' record(s)

been updated.'

close cur

deallocate cur

set nocount off

/*****以上為操作實體******/

相關建議 by xutingxin @

解決辦法:1 嚴格過濾 request.form 和 request.querystring 獲取的內容,堅決不用 request("name") 這樣的方式獲取值,凡是採用 cookies 儲存的內容,盡量不要用在sql語句裡進行查詢資料庫操作;2 重要的使用者資料盡量採用 session 驗證,因為session是伺服器端的,客戶端無法偽造資料,除非他有你伺服器的許可權。

可以採用以下的防範 get 、post以及cookies 注入的**來過濾 sql 注入攻擊: 

response.buffer = true  '快取頁面

'防範get注入

if request.querystring <> ""  then stopinjection(request.querystring)

'防範post注入

if request.form <> ""  then stopinjection(request.form)

'防範cookies注入

if request.cookies <> ""  then stopinjection(request.cookies) 

'正則子函式

function stopinjection(values)

dim regex

set regex = new regexp

regex.ignorecase = true

regex.global = true

regex.pattern = "'|;|#|([\s\b+()]+([email=select%7cupdate%7cinsert%7cdelete%7cdeclare%7c@%7cexec%7cdbcc%7calter%7cdrop%7ccreate%7cbackup%7cif%7celse%7cend%7cand%7cor%7cadd%7cset%7copen%7cclose%7cuse%7cbegin%7cretun%7cas%7cgo%7cexists)[/s/b]select|update|insert|delete|declare|@|exec|dbcc|alter|drop|create|backup|if|else|end|and|or|add|set|open|close|use|begin|retun|as|go|exists)[\s\b[/email]+]*)"

dim sitem, svalue

for each sitem in values

svalue = values(sitem)

if regex.test(svalue) then

response.write ""

response.end

end if

next

set regex = nothing

end function

把以上的**另存為乙個檔案,如 antisql.asp ,然後在資料庫連線檔案開頭包含這個檔案 ,就可以實現全站的防範 sql 注入的攻擊了。 

漏洞分析 二進位制漏洞

二進位制漏洞 傳統的緩衝區溢位 uaf use after free 等涉及二進位制編碼的漏洞統稱為二進位制漏洞 根據緩衝區所處的不同記憶體空間以及分配方式的不同,緩衝區溢位可以分為棧溢位和堆溢位 棧溢位原理 棧是一種基本的資料結構,是由編譯器自動進行分配 釋放的。棧遵循先進後出的規則,生長方向為從...

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...

二進位制漏洞原理 整型溢位漏洞

整數分為有符號和無符號兩類,有符號數以最高位作為符號位,正整數最高位為1,負整數最高位為0,不同型別的整數在記憶體中有不同的取值範圍,unsigned int 4位元組,int 4位元組,當儲存的數值超過該型別整數的最大值就會發生溢位。在一些有符號和無符號轉換的過程中最有可能發生整數溢位漏洞。基於棧...