SQL注入原理、常见思路之Access手工注入实战

注入攻击

定义:注入攻击发生在当不可信的数据作为命令或者查询语句的一部分, 被发送给解释器的时候。攻击者发送的恶意数据可以欺骗解释器, 以执行计划外的命令或者访问未被授权的数据。

注入攻击常见类型有:

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抓包。一般存在注入点的地方包括输入账号密码的表单,搜索功能等,只要是与数据库交互的地方。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注