要想学会手工注入,有一个名词是不得不提的,那就是数据库系统。
1。简介
数据库系统分为数据库和数据库管理系统!数据库是存放数据的地方,数据库管理系统则是管理数据库的软件!数据库中数据的存储节构叫数据模型!有四种常 见的数据模型,分别是层次模型、网状模型、关系模型和面向对象模型。其中关系数据模型是最主要的数据模型,ACCESS、MSSQL、ORACLE等都是 关系模型数据库系统。其中以ACCESS、MSSQL数据库系统最为常见!这些都是理论的知识,希望大家理解。
2。基本概念
表:表是一个关系数据库的基本组成元素!它按行与列组合排列成相关信息。通常行称为记录,列称为域。每个域称为一个字段!每一条记录都由多个字段组成。每个字段的名字叫做字段名,每个字段的值叫估字段值。表中的每一行即每一条记录都拥有想同的结构。
3。注入的条件
只有调用数据库的动态页面才有可有存在注入漏洞,动态页面包括asp php jsp cgi等。本文只讲对asp页面的注入。那什么是调用数据库的页面呢?比如这样的形势:
asp?id= php?id= 这样的样子的都是调用数据库的页面。"?"后面加的id的名字叫变量,注意这个变量是可以随便换的,"="号后面的值名字叫参数!这个参数也是可以变的!大家的思路一定要灵活,要学会举一反三,不要太死板。
4。注入漏洞的原理分析:
程序对用户提交的变量没有进行有效的过滤,就直接带入查询语句中,这样,我们就可以提交具有数据查询功能的语句,加入到程序将要提交的信息中去,再根据服务器返回的信息来判断数据库里的内容!光这样说大家可能不太好理解,不要紧,接着往下看。
有关的基础已经讲完了 下面开始实战练习部分。
实战部分
如果是刚刚接触注入的新手朋友,我们要做的第一步就是,用鼠标右键点击桌面上的IE图标,再点属性,然后再点“高级”,然后往下拉滚动条,找到“显示
友好HTTP错误信息”,把前面的勾去掉,再点“确定”,这样做是为了让我们得到更多的服务器返回的信息。
第一部分:ACCESS数据库手工注入
1。判断是否存在注入漏洞:
这个相信大家都应该知道! 就是在一个调用数据库的网址后面加上分别加上and 1=1和and 1=2,如果加入and 1=1返回正常(就是和原来没有加and 1=1时页面样子的一样),而加入and 1=2返回错误(和原来没有加 and 1=2时页面的样子不一样),就可以证明这个页面存在注入漏洞。比如:
http://www.xxx.com/a.asp?id=7,这个网页,我们在后面加上 and 1=1(两个空格,and前面一个,and和1=1之间一个!),网址就变成了
http://www.xxx.com/a.asp?id=7 and 1=1,返回正常!再尝试在后面加上and 1=2,网址就变成了
http://www.xxx.com/a.asp?id=7 and 1=2,返回错误!这就说明这个网页http://www.xxx.com/a.asp?id=7存在注入漏洞,是一个注入点!(存在注入漏洞的网页叫注入点!)可是,并不是所有的页面都可以这样判断,有的页面不管你加入 and 1=1 还是 and 1=2,返回的都是错误的页面,难道这样的页面就没有注入漏洞吗?不一定!比如这个页面:http://www.xxxxxx.com/b.asp?id=ade7, 不管我们在后面上的是and 1=1还是and 1=2,它都返回错误的页面!这个时候我们就要尝试用另一种方法来测试漏洞了,这种方法可以说是and 1=1和and 1=2的变种方法。原来的网址是这样的:http://www.xxxxxx.com/b.asp?id=ade7
我们在注入点后加上and exists (select count(*) from msysobjects)。就成了http://www.xxxxxxxx.com/article/as.asp?id=875 and exists (select count(*) from msysobjects),按刚才理解MSSQL数据库的方法去理解这条语句!这里要注意,提交这个语句是不会返回正常页面的!就算是ACCESS数据库也不会返回正常的页面!因为默认情况下,我们是没有权限查询这个表里的数据的!不过WEB会提示我们 “记录无法读取;'msysobjects'没有读取权限”!如果返回的是这个错误信息的话,那就证明是ACCESS数据库了!如图3!简单地来说就是两 条查询语句:
and exists (select count(*) from sysobjects) 页面正常返回,那就可以证明数据库是MSSQL的
and exists (select count(*) from msysobjects) 提示我们 “记录无法读取;'msysobjects'没有读取权限”!那就证明是ACCESS数据库
如果第一条返回正常,那就是MSSQL数据库,如果两条都不正常,那就是ACCESS数据库了(这里只讨论MSSQL和ACCESS)
注意:上面讲的全是参数是int的时候的检测方法,如果参数是字符型的,那就先要在参数后面加上单引号,然后再在查询语句最后加上";--"