ModSecurity SQL注入攻击

ModSecurity是一个入侵探测与阻止的引擎,它主要是用于Web应用程序所以也可以叫做Web应用程序防火墙.它可以作为Apache Web服务器的一个模块或单独的应用程序来运行。ModSecurity的目的是为增强Web应用程序的安全性和保护Web应用程序避免遭受来自已知与未知的攻击。本文主要介绍了针对开源WAF的一次渗透测试比赛中的思路。

1. 文章背景

ModSecurity SQL Injection Challenge(ModSecurity发起的一个针对开源WAF的一次渗透测试比赛)

owasp-modsecurity-crs(OWASP针对ModSecurity编写的权威rule)

https://github.com/SpiderLabs/owasp-modsecurity-crs

2. 绕过思路分析

0×1:

目标应用系统: Acunetix Acuart Site

注入点: ?artist=1‘;

分析:

注入点很明显,通过测试可以知道这个注入点为数字型的注入,各种拼接都可以进行,但是普通的注入方法无一例外都会触发Mod的拦截规则。

这里采用mysql注释+CRLF绕过思路来进行注入

Mysql Comment Syntax

1) "#"用于单行注释

2) "– "用于单行注释,但要注意使用这种风格的注释符必须保证在"双横线"后面跟上一个"空格或控制符Control Char(控制符可以是空格, Tab制表符, 换行符Newline…)"(在使用的时候要注意URL编码,例如换行符的URL编码为%0D%0A)。关于这种"Double Dash注释符"在Mysql的官方文档中还有一点细节要注意(重点就是新版的Mysql解析引擎的改进避免了"基于减号导致的注释型注入")

3) "/* */"C风格的注释符,这种注释允许跨行注释(即允许在注释符中添加换行符,例如: /*..%0D%0A..*/)

mysql> SELECT 1+1; # This comment continues to the end of line mysql> SELECT 1+1; -- This comment continues to the end of line mysql> SELECT 1/* this is an in-line comment */ + 1; mysql> SELECT 1+ /* this is a multiple-line comment */ 1;

回到我们的注入点上来看看,我们使用mysql注释+CRLF来进行payload的构造(注意URL编码):

?artist=0+div+1+union%23foo*%2F*bar%0D%0Aselect%23foo%0D%0A1%2C2%2Ccurrent_user

对其URL转义如下(注意换行符的解析):

0 div 1 union#foo*/*bar

select#foo

1,2,current_user

这句sql语句到了Mysql的解析引擎后会再次被解析为:

0 div 1 union select 1,2,current_user

可以看到,注释符之间进行了就近原则的交错组合,Mysql的Sql Parser则选择进行了忽略。

而ModSecurity CRS的规则如下:

注意到这个":replaceComments",我们知道,ModSecurity使用正则表达式来对Input Sql进行匹配检测,对Select、Union在敏感位置的出现都进行了拦截,但是ModSecurity有一个特点(或者叫优点),它会对输入进行"规范化",规范化的本意本来是防御"基于编码格式、解析顺序"的绕过的。

例如:

Mod可以抵抗这种形式的绕过:

SEL/**/ECT

在"规范化"之后,攻击者的本来目的就暴力在了Mod的检测下,这个时候再上规则就可以检测出来了,可以说,规范化是一个很好的防御思路。

但是这里却导致了另一种的"绕过"

问题的关键就在于ModSecurity对注释的理解和Mysql的解析引擎理解不同

(这似乎又回到了那个老问题: 同一个业务规则在不同的系统中的理解语义不同往往可能导致绕过)

:replaceComments

Unterminated comments will also be replaced with a space (ASCII 0x20). However, a standalone termination of a comment (*/) will not be acted upon.

也就是说,Mod会忽略前向半开注释并把后向半开注释当成单行注释(如果它没有找到后向半开的闭合注释时)

Mod的拦截日志中可以看到如下记录:

这样,在Mod看来,我们输入的Payload就变成了:

"0 div 1 union#foo* "

但是在Mysql看来,我们的sql语句其实是:

0 div 1 union select 1,2,current_user

防御方法:

1) 将原来的去除注释方法改为对SQL注释的匹配

# # -=[ Detect SQL Comment Sequences ]=- # SecRule REQUEST_COOKIES|REQUEST_COOKIES_NAMES|REQUEST_FILENAME|ARGS_NAMES|ARGS|XML:/* \ "(\/\*\!?|\*\/|\-\-[\s\r\n\v\f]|(?:--[^-]*-)|([^\-&])#.*[\s\r\n\v\f]|;?\\x00)" \ "phase:2,rev:‘2.2.2‘,id:‘981231‘,t:none,t:urlDecodeUni,block,msg:‘SQL Comment Sequence Detected.‘,capture,logdata:‘%{tx.0}‘,tag:‘WEB_ATTACK/SQL_INJECTION‘,tag:‘WASCTC/WASC-19‘,tag:‘OWASP_TOP_10/A1‘,tag:‘OWASP_AppSensor/CIE1‘,tag:‘PCI/6.5.2‘,setvar:tx.anomaly_score=+%{tx.warning_anomaly_score},setvar:tx.sql_injection_score=+1,setvar:‘tx.msg=%{rule.msg}‘,setvar:tx.%{rule.id}-WEB_ATTACK/SQL_INJECTION-%{matched_var_name}=%{tx.0}"

但是这种方法从本质上又回到了"黑名单模式"的范畴中,有可能再次导致别的形式的绕过

2) 使用多行匹配(MultiMatch Action)+规范化方法(ReplaceComments)

SecRule REQUEST_COOKIES|REQUEST_COOKIES_NAMES|REQUEST_FILENAME|ARGS_NAMES|ARGS|XML:/* "(?i:\buser_tables\b)" \ "phase:2,rev:‘2.2.2‘,capture,multiMatch,t:none,t:urlDecodeUni,t:replaceComments,ctl:auditLogParts=+E,block,msg:‘Blind SQL Injection Attack‘,id:‘959918‘,tag:‘WEB_ATTACK/SQL_INJECTION‘,tag:‘WASCTC/WASC-19‘,tag:‘OWASP_TOP_10/A1‘,tag:‘OWASP_AppSensor/CIE1‘,tag:‘PCI/6.5.2‘,logdata:‘%{TX.0}‘,severity:‘2‘,setvar:‘tx.msg=%{rule.msg}‘,setvar:tx.sql_injection_score=+%{tx.critical_anomaly_score},setvar:tx.anomaly_score=+%{tx.critical_anomaly_score},setvar:tx.%{rule.id}-WEB_ATTACK/SQL_INJECTION-%{matched_var_name}=%{tx.

0×2:

目标应用系统: Cenzic Crack Me Bank

注入点: (POST)

注入Payload:

绕过分析:

这里采用了"碎片注入法(分段SQL注入)",或者是我们常说的"Split And Balance原则"。例如:

对于最简单的情况,可以使用字符串连接技术将较小的部分构造成一个字符串。不同的数据库使用不同的语法来构造字符串

oracle: ‘selec‘||‘t‘ sqlserver: ‘selec‘+‘‘; mysql: ‘selec‘+‘t‘

(这就是所谓的split and balance思想)

还要注意的是,加号和空格要先进行URL编码后再发送

这种技术的好处是可以将原本完整的Payload分成几段,利用ModSecurity对SQL语义的理解不全来进行规则绕过。常常用于进行"二值逻辑"的盲注推理。

回到我们的注入点上来看:

对于Mod来说,我们的攻击Payload为:

hUserId=22768&FromDate=a1%27+or&ToDate=%3C%3Eamount+and%27&sendbutton1=Get+Statement

而对于Mysql的解析引擎来说,它会自动去除、转换这些连接控制符,从而变成:

hUserId=22768&FromDate=a1%27+or&ToDate=<>amount and%27&sendbutton1=Get Statement

防御方法:

1) 这里有个概念叫"String Termination/Statement Ending Injection Testing"。攻击者在进行SQL注入检测的时候常常会使用一些"终止符",例如单引号、NULL等等,并通过观察页面是否报错来获知当前页面是否存在注入点。

为了防御这种注入,我们可以使用以下CRS规则:

# # -=[ String Termination/Statement Ending Injection Testing ]=- # # Identifies common initial SQLi probing requests where attackers insert/append # quote characters to the existing normal payload to see how the app/db responds. # SecRule REQUEST_COOKIES|REQUEST_COOKIES_NAMES|REQUEST_FILENAME|ARGS_NAMES|ARGS|XML:/* \ "(?i:(\!\=|\&\&|\|\||>>|<<|>=|<=|<>|<=>|xor|rlike|regexp|isnull)|(?:not\s+between\s+0\s+and)|(?:is\s+null)|(like\s+null)|(?:(?:^|\W)in[+\s]*\([\s\d\"]+[^()]*\))|(?:xor|<>|rlike(?:\s+binary)?)|(?:regexp\s+binary))" \ "phase:2,rev:‘2.2.2‘,capture,t:none,t:urlDecodeUni,block,msg:‘SQL Injection Attack: SQL Operator Detected‘,id:‘981212‘,logdata:‘%{TX.0}‘,severity:‘2‘,tag:‘WEB_ATTACK/SQL_INJECTION‘,tag:‘WASCTC/WASC-19‘,tag:‘OWASP_TOP_10/A1‘,tag:‘OWASP_AppSensor/CIE1‘,tag:‘PCI/6.5.2‘,setvar:‘tx.msg=%{rule.msg}‘,setvar:tx.sql_injection_score=+%{tx.notice_anomaly_score},setvar:tx.anomaly_score=+%{tx.notice_anomaly_score},setvar:tx.%{rule.id}-WEB_ATTACK/SQL_INJECTION-%{matched_var_name}=%{tx.0}"

2) 注意到我们的攻击Payload中一个Mysql逻辑运算符: "<>"。攻击者可以利用逻辑运算符进行"盲注推理"。例如,我们常见的传统盲注手段:

and (ascii(substring((select username from admin),1,1)))>97

(这种就是将逐个字符转成ASCII值然后用二分查找法进行猜测)

UPDATE table SET views = ‘1‘ WHERE id = -2441 OR (ORD(MID((SELECTIFNULL(CAST(FirstName AS CHAR),0x20) FROM nowamagic.`tb2` ORDER BY id LIMIT 1,1),2,1))>112)#

(同样的思路,换了一个函数)

为了防御这种注入,我们可以使用以下CRS规则

# # -=[ SQL Operators ]=- # SecRule REQUEST_COOKIES|REQUEST_COOKIES_NAMES|REQUEST_FILENAME|ARGS_NAMES|ARGS|XML:/* \ "(?i:(\!\=|\&\&|\|\||>>|<<|>=|<=|<>|<=>|xor|rlike|regexp|isnull)|(?:not\s+between\s+0\s+and)|(?:is\s+null)|(like\s+null)|(?:(?:^|\W)in[+\s]*\([\s\d\"]+[^()]*\))|(?:xor|<>|rlike(?:\s+binary)?)|(?:regexp\s+binary))" \ "phase:2,rev:‘2.2.2‘,capture,t:none,t:urlDecodeUni,block,msg:‘SQL Injection Attack: SQL Operator Detected‘,id:‘981212‘,logdata:‘%{TX.0}‘,severity:‘2‘,tag:‘WEB_ATTACK/SQL_INJECTION‘,tag:‘WASCTC/WASC-19‘,tag:‘OWASP_TOP_10/A1‘,tag:‘OWASP_AppSensor/CIE1‘,tag:‘PCI/6.5.2‘,setvar:‘tx.msg=%{rule.msg}‘,setvar:tx.sql_injection_score=+%{tx.notice_anomaly_score},setvar:tx.anomaly_score=+%{tx.notice_anomaly_score},setvar:tx.%{rule.id}-WEB_ATTACK/SQL_INJECTION-%{matched_var_name}=%{tx.0}"

0×3:

目标应用系统: IBM demo.testfire.net site

注入点: (POST)

注入Payload:

这里使用了HPP(HTTP Parameter Pollution)注入技术,关于HPP,有很多相关的资料:

https://www.owasp.org/images/b/ba/AppsecEU09_CarettoniDiPaola_v0.8.pdf

回到我们的注入Payload上来,我们注意到after这个字段出现了3次,其中后2次的出现其实是产生了逗号的作用,以此来进行绕过。要注意的一点是,HPP攻击和具体的应用系统环境有很大关系,在不同的系统上表现不太一致:

https://www.trustwave.com/spiderlabs/advisories/TWSL2011-006.txt

防御方法:

我们可以采用以下的CRS规则来防御HPP攻击:

# -=[ Rules Logic }=- # The ruleset below is not looking for attacks directly, but rather is a crude normalization # function that mimics ASP.NET with regards to joining the payloads of parameters with the # same name. These rules will create a new TX:HPP_DATA variable that will hold this data. # If you have enabled PARANOID_MODE, then this variable data will also be searched against # attack filters. # # -=[ References ]=- # # SecRule ARGS "^" "chain,phase:2,t:none,nolog,pass,capture,id:‘900032‘,rev:‘2.2.9‘,setvar:tx.%{matched_var_name}=+1" SecRule TX:/^ARGS:/ "@gt 1" "chain,t:none" SecRule MATCHED_VARS_NAMES "TX:(ARGS:.*)" "chain,capture,t:none,setvar:tx.hpp_names=%{tx.1}" SecRule ARGS ".*" "chain,t:none,capture,setvar:tx.arg_counter=+1,setvar:‘tx.hppnamedata_%{tx.arg_counter}=%{matched_var_name}=%{tx.0}‘" SecRule TX:/HPPNAMEDATA_/ "@contains %{tx.hpp_names}" "chain,setvar:tx.hpp_counter=+1,setvar:tx.hpp_counter_%{tx.hpp_counter}=%{matched_var}" SecRule TX:/HPP_COUNTER_/ "ARGS:(.*)?=(.*)" "capture,setvar:‘tx.hpp_data=%{tx.hpp_data},%{tx.2}‘"

0×4:

目标应用系统: Cenzic Crack Me Bank

注入点: (POST)

注入Payload:

思路分析:

这里采用了"半开注释符(Unterminated Comments)"+"Mysql注释符代码执行(MySQL Comment Extensions for conditional code execution)"技术来进行绕过

半开注释符我们之前说过了,是利用Mod的replaceComments来进行敏感关键字的绕过。而"Mysql注释符代码执行"则是Mysql的一个运行机制。

Mysql的官方文档如下:

MySQL Server supports some variants of C-style comments. These enable you to write code that includes MySQL extensions, but is still portable, by using comments of the following form:

(Mysql允许C风格的注释符,并允许在其中写入Mysql扩展,即插入可执行sql代码)

/*! MySQL-specific code */

Mysql的Paerser引擎会自动解析这种格式中的sql代码,同时其他的数据库(例如MSSQL、ORACLE会自动忽略这些注释),也就是说,这是Mysql特有的特性:

select 1 union/*! select */version();

select 1 union/*!32302 select */version();

防御方法:

和 0×1 一样,采用使用多行匹配(MultiMatch Action)+规范化方法(ReplaceComments)

0×5:

目标应用系统: IBM demo.testfire.net site

注入点: (COOKIE)

注入Payload:

注入分析:

注入点并没有什么特别的,关键在与这里采用了COOKIE注入

防御方法:

关于这个COOKIE注入,我想延伸几点想法:

在注入点的选择中,HTTP中的任何字段、任何位置都"有可能"产生SQL注入,这里只能说有可能,因为是否能否产生注入,和具体的应用系统的环境有关,即应用系统会使用哪些字段带入数据进行执行

"GPCS"的作用:

在php.ini中有一项配置: variables_order = "GPCS"(具体的顺序和字符和具体你的配置有关)

如果在php.ini中开启了"register_globals"这个选项,则PHP会按照"$GET"、"$POST"、"$COOKIE"、"SERVER"的顺序来把这些全局数据中国的子键抽取出来,注册到本地变量的的符号表中,即全局变量本地化。这个顺序很重要,这往往是很多本地变量覆盖漏洞利用的关键

3.  HTTP中的任意位置都有可能产生SQL注入,看下面的例子:

Create New Admin Exploit FOR php168 v4.0SP

这个例子中,注入点发生在"X-FORWARDED-FOR"这个字段中,这本来是应用系统用来做记录登录用户的IP、代理IP的业务功能,但是因为没有过滤严格,导致了注入的发生

0×6:

目标应用系统: Acunetix Acuart Site

注入点: ?artist=1‘

注入Payload:

?artist=%40%40new%20union%23sqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsql%0Aselect%201,2,database%23sqlmap%0A%28%29

Payload分析:

这里采用了"Mysql注释(MySQL Comment )"+"换行绕过(New Line trick )"的组合方法来进行Mod的绕过(本质上是对Mod所使用的正则表达式的绕过)

在Mod看来,我们的Payload如下:

[email protected]@new union#sqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsql

select 1,2,database#sqlmap

()

然而,当这段SQL代码进入Mysql的解析引擎的时候,Mysql看到的是这样的形式:

[email protected]@new union select 1,2,database()

防御方法:

我们知道,SQL(Structure Query Language)是一种及其灵活的命令式语言,各个元素之间的组合可以有很多种,采用正则REGEX的方法来进行匹配常常无法做到精确指导,为了解决这个问题,我们有两种思路

1) 采用高阶的SQL解析方法,例如AST:

2) 改进正则,采用敏感关键字匹配的方法

SecRule REQUEST_FILENAME|ARGS_NAMES|ARGS|XML:/* \ "([\~\!\@\#\$\%\^\&\*\(\)\-\+\=\{\}\[\]\|\:\;\"\‘\′\’\‘\`\<\>].*){4,}" \ "phase:2,t:none,t:urlDecodeUni,block,id:‘981173‘,rev:‘2.2.1‘,msg:‘Restricted SQL Character Anomaly Detection Alert - Total # of special characters exceeded‘,capture,logdata:‘%{tx.1}‘,setvar:tx.anomaly_score=+%{tx.warning_anomaly_score},setvar:tx.sql_injection_score=+1,setvar:‘tx.msg=%{rule.msg}‘,setvar:tx.%{rule.id}-WEB_ATTACK/RESTRICTED_SQLI_CHARS-%{matched_var_name}=%{tx.0}"

0×7:

目标应用系统: Acunetix Acuart Site

注入点: ?artist=1‘

1.png

注入Payload:

1.png

1.png

Payload分析:

这里采用了"Mysql错误回显"+"Tab键分隔绕过"的组合方法来进行Mod的绕过,这里的关键点是没有使用传统的空格来进行"Split And Balance"。

这里要提的是黑名单思想,对"Split And Balance"的防御如果采用黑名单容易产生绕过:

https://docs.google.com/document/d/1rO_LCBKJY0puvRhPhAfTD2iNVPfR4e9KiKDpDE2enMI/edit?pli=1#Allowed_Intermediary_Character_30801873723976314

如果一定要采用黑名单,则必须进行严格的代码审计和测试,保证黑名单的完整性

例如,在Mysql中允许的分隔符为:

09

0A

0B

0C

0D

A0

防御方法:

采用完整的"准空格分隔符"黑名单CRS

SecRule REQUEST_COOKIES|REQUEST_COOKIES_NAMES|REQUEST_FILENAME|ARGS_NAMES|ARGS|XML:/* \ "(?i:(?:,.*[)\da-f(\"|‘|`|′|’|‘)](\"|‘|`|′|’|‘)(?:(\"|‘|`|′|’|‘).*(\"|‘|`|′|’|‘)|\Z|[^(\"|‘|`|′|’|‘)]+))|(?:\Wselect.+\W*from)|((?:select|create|rename|truncate|load|alter|delete|update|insert|desc)\s*\(\s*space\s*\())" \ "phase:2,capture,multiMatch,t:none,t:urlDecodeUni,t:replaceComments,block,msg:‘Detects MySQL comment-/space-obfuscated injections and backtick termination‘,id:‘981257‘,tag:‘WEB_ATTACK/SQLI‘,tag:‘WEB_ATTACK/ID‘,logdata:‘%{TX.0}‘,severity:‘2‘,setvar:‘tx.msg=%{rule.id}-%{rule.msg}‘,setvar:tx.anomaly_score=+5,setvar:‘tx.%{tx.msg}-WEB_ATTACK/SQLI-%{matched_var_name}=%{tx.0}‘,setvar:‘tx.%{tx.msg}-WEB_ATTACK/ID-%{matched_var_name}=%{tx.0}‘

3. 总结

Blacklist filtering is not enough — 不要依赖黑名单机制

应该使用多种方法进行纵深防御

https://www.trustwave.com/application-security/

对输入验证采用安全模型,包括规范化、数据类型,数据格式,数据长度

https://www.trustwave.com/web-application-firewall/

WAF作为一个防御手段,从某种程序上来说只是增加了攻击者的攻击成本,并不能从根本上解决注入的发生,要解决注入漏洞的产生,保护敏感数据,必须多管齐下,从应用系统、WAF、数据库防火墙的角度去思考

原文地址:http://www.41443.com/HTML/wangzhananquan/20141212/235953.html

时间: 2024-10-12 12:43:40

ModSecurity SQL注入攻击的相关文章

ModSecurity SQL注入攻击 – 深度绕过技术挑战

ModSecurity是一个入侵探测与阻止的引擎,它主要是用于Web应用程序所以也可以叫做Web应用程序防火墙.它可以作为Apache Web服务器的一个模块或单独的应用程序来运行.ModSecurity的目的是为增强Web应用程序的安全性和保护Web应用程序避免遭受来自已知与未知的攻击.本文主要介绍了针对开源WAF的一次渗透测试比赛中的思路. 1. 文章背景 ModSecurity SQL Injection Challenge(ModSecurity发起的一个针对开源WAF的一次渗透测试比赛

什么是XSS攻击?什么是SQL注入攻击?什么是CSRF攻击?

答: - XSS(Cross Site Script,跨站脚本攻击)是向网页中注入恶意脚本在用户浏览网页时在用户浏览器中执行恶意脚本的攻击方式.跨站脚本攻击分有两种形式:反射型攻击(诱使用户点击一个嵌入恶意脚本的链接以达到攻击的目标,目前有很多攻击者利用论坛.微博发布含有恶意脚本的URL就属于这种方式)和持久型攻击(将恶意脚本提交到被攻击网站的数据库中,用户浏览网页时,恶意脚本从数据库中被加载到页面执行,QQ邮箱的早期版本就曾经被利用作为持久型跨站脚本攻击的平台).XSS虽然不是什么新鲜玩意,但

web前端安全之SQL注入攻击

一.SQL注入攻击的原理攻击者在HTTP请求中注入恶意的SQL代码,并在服务端执行.比如用户登录,输入用户名camille,密码 ' or '1'='1 ,如果此时使用参数构造的方式,就会出现 select * from user where name = 'camille' and password = '' or '1'='1' 不管用户名和密码是什么,查询出来的用户列表都不为空,这样可以随意看其他用户的信息. 二.SQL注入攻击的防御1.客户端 限制字符串输入的长度: 有效性检验. //过

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

前言 前面我们学习了如何寻找,确认,利用SQL注入漏洞的技术,本篇文章我将介绍一些更高级的技术,避开过滤,绕开防御.有攻必有防,当然还要来探讨一下SQL注入防御技巧. 目录 第五节 避开过滤方法总结 5.1.大小写变种 5.2.URL编码 5.3.SQL注释 5.4.空字节 5.5.二阶SQL注入 第六节 探讨SQL注入防御技巧 6.1.输入验证 6.2.编码输出 正文 第五节 避开过滤方法总结 Web应用为了防御包括SQL注入在内的攻击,常常使用输入过滤器,这些过滤器可以在应用的代码中,也可以

使用SQLMAP对网站和数据库进行SQL注入攻击

from:http://www.blackmoreops.com/2014/05/07/use-sqlmap-sql-injection-hack-website-database/ 0x00 背景介绍 1. 什么是SQL注入? SQL注入是一种代码注入技术,过去常常用于攻击数据驱动性的应用,比如将恶意的SQL代码注入到特定字段用于实施拖库攻击等.SQL注入的成功必须借助应用程序的安全漏洞,例如用户输入没有经过正确地过滤(针对某些特定字符串)或者没有特别强调类型的时候,都容易造成异常地执行SQL

网络攻防之SQL注入攻击

SQL注入攻击的根源是因为SQL规范的漏洞,但是,因为规范的长期存在以及使用,几乎已经不太可能去修改规范了,只能够从开发者本身去避免攻击,虽然SQL注入之前很严重,但现在相对控制的很好,这里仅仅作为一种学习的内容. 测试过程如下: 1:搭建PHP,mysql开发环境,可以详见我的另一篇博客自定义开发PHP环境 2:添加数据库,表,以及表内容. 3:分别测试 万能密码,万能用户名 数字注入 测试如下: 万能密码:password ' or 1='1 (password可以任意的填写,注:这里如果粘

Web安全篇之SQL注入攻击

在网上找了一篇关于sql注入的解释文章,还有很多技术,走马观花吧 文章来源:http://www.2cto.com/article/201310/250877.html ps:直接copy,格式有点问题~ 大家早上好!今天由我给大家带来<web安全之SQL注入篇>系列晨讲,首先对课程进行简单介绍,SQL注入篇一共分为三讲:       第一讲:"纸上谈兵:我们需要在本地架设注入环境,构造注入语句,了解注入原理.":       第二讲:"实战演练:我们要在互联网上

参数化登陆防止SQL注入攻击

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; namespace _01参数化登陆防止SQL注入攻击 { public

2015-9-28 SQL注入攻击

SQL注入攻击实例 (1)SQL命令插入到Web表单的输入域  或   页面请求的查询字符串,欺骗服务器执行恶意的SQL命令 一个简单的登录页面 private bool NoProtectLogin(string userName, string password) { int count = (int)SqlHelper.Instance.ExecuteScalar(string.Format ("SELECT COUNT(*) FROM Login WHERE UserName='{0}'