《Web安全程序设计与实践》课件项目3_第1页
《Web安全程序设计与实践》课件项目3_第2页
《Web安全程序设计与实践》课件项目3_第3页
《Web安全程序设计与实践》课件项目3_第4页
《Web安全程序设计与实践》课件项目3_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

项目3万能密码登录——Post型注入攻击【项目描述】本项目对Post型SQL注入攻击和防护进行实训。本项目包含四个任务,首先建立建立用户信息数据库,然后开发一个基于Session验证的用户登录功能网站,并在网页表单使用Post的方式提交用户参数。接下来实现基于SQL注入方式的万能密码登录。最后通过分析万能密码SQL注入的原理,实现对Post型SQL注入攻击的多种防护方式。通过本项目的实训,可以解释和分析万能密码登录漏洞为例子的Post型SQL注入原理及危害,应用多种方式实现SQL注入攻击的防护。【知识储备】HTML的Post与Get提交信息方式Post型SQL注入攻击使用了HTML的Post提交信息方式。在HTML中,经常会用表单<form>进行信息的收集,然后提交给服务器进行处理。HTML提交信息的方式有Get和Post两种。Get方式Post方式在URL显示表单参数的key/value值不在URL里显示表单的数据长度有限制,只适合有少量参数的表单表单提交的信息没有长度限制历史参数保留在浏览器历史中参数不会保存在浏览器历史中可以通过保留URL的方式保存数据不能通过保留URL保存数据刷新不会重新提交刷新会重新提交表单的数据集的值必须为ASCII字符没有限制表

3‑1Post方式与Get方式的主要区别Session机制的原理HTTP协议是无状态的,也就是说,客户端的每个HTTP请求都是独立的,与前面或者后面的HTTP请求都没有直接联系。这样的好处是,服务器不需要为每个连接维持状态而消耗大量资源。最初设计的HTTP协议只是用来浏览静态文件,无状态特点已经足够。但是随着Web应用的发展,需要变得有状态,比如需要保持用户的登录状态。Session机制就是用来保存用户登录状态的。用户提交登录信息并通过验证之后,在服务器将用户信息保存在Session变量中,在用户的浏览器则保存这个Session的ID(即SessionID)。当用户再次访问这个服务器时会将此SessionID提交,服务器便可以验证此SessionID是否存在于Session变量中,进而判断是否为登录用户基于Session机制的Web登录验证过程用户账号信息提交在Web服务器建立Session会话退出登录万能密码SQL注入攻击的原理所谓万能密码,就是通过在输入的用户名或者密码构造出一个特殊的SQL语句,破坏原有的SQL语句结构和逻辑,最终达到欺骗服务器执行恶意的SQL命令,进而绕过权限检查登录系统。由于用户登录基本都是使用HTML的Post方式提交账号和密码等信息,因此万能密码登录是一种典型的Post型SQL注入攻击。SQL注入攻击的危害虽然Post型和Get型注入攻击在方式上有所区别,但都是通过破坏正常的SQL语句结构,实现对数据库非正常增删改查。SQL注入攻击的危害主要体现在:绕过登录检查;获取、篡改数据库信息;篡改网页内容、网页挂马;控制网站、甚至整个服务器等。【任务3-1】创建数据库本任务采用SQL脚本的方式创建数据库lab。并在该数据库中建立表users,最后插入两条记录。在Apache的网站根目录C:\Apache24\htdocs\下新建一个文件夹logintest作为本项目的网站目录。基于SQL脚本的方式创建数据库有两个步骤,分别是:创建SQL脚本将脚本文件导入到数据库【任务3-2】建立基于Session验证的用户登录网站在本任务,分别创建用户登录HTML页面和验证登录的PHP后端页面,以实现用户登录功能。用户登录成功之后会跳转到欢迎页面,并创建退出登录页面销毁用户Session。最后进行功能测试,以验证所设计的功能。3-2-1任务实现创建用户登录页面login.html设置编码方式为UTF8并保存登录验证后端页面欢迎页面销毁session页面3-2-2功能测试打开浏览器,在地址栏输入服务器的地址和相对路径以及文件名,即可访问。本书默认的浏览器客户端都是在Web服务器的本地访问,在地址栏输入URL的主机地址都是localhost或者,比如输入http://localhost/logintest/login.html打开登录页面在该页面点击超链接“欢迎访问”,进入welcome页面在该页面点击超链接“退出登录”,进入logout页面注销登录【任务3-3】万能密码SQL注入攻击测试在本任务,利用万能密码进行Post型SQL注入攻击测试,绕过登录检查进入欢迎页面。并对万能密码注入攻击的原理进行分析,最后讨论其它形式的万能密码SQL注入及其原理。3-3-1测试过程用户名注入在Username输入:'or1=1or',Password随便输入(比如输入123),点击Submit按钮则可以登录进入系统注意:引号为英文的单引号在欢迎登录页面,可以看到登录用户为admin密码注入在Username随便输入(比如输入admin),在Password输入'or'1=1,也可以登录系统其效果与用户名注入方式相同3-3-2其它形式的万能密码'or''=''or‘注意都是单引号将其代入到SQL语句的变量后,则查询语句变成了:select*fromuserswhereusername=''or''=''or''andpasscode='123'该语句的条件是恒成立的,因此查询的结果也是users表的全部记录--注释也可以使用注释的方式实现万能密码,比如'or1=1--'(注意:两个连续的减号后面必须有一个空格)。将其代入到SQL语句的变量后,则查询语句变成了:select*fromuserswhereusername=''or1=1--''andpasscode='123'在SQL语句中,两个减号表示后面的语句被注释掉。因此该查询语句变成了:select*fromuserswhereusername=''or1=1该条件是恒成立的,查询的结果也是users表的全部记录#注释注释型的万能密码也可以说使用#(即英文的井号),比如'or1=1#。将其代入到SQL语句的变量后,则查询语句变成了:select*fromuserswhereusername=''or1=1#'andpasscode='123'去掉注释后的查询语句变成了:select*fromuserswhereusername=''or1=1该语句的查询效果与以上相同3-3-3测试分析在用户名注入情况下,将字符串'or1=1or'代入到check_login.php页面第16行的变量$username,将字符串123代入到变量$passwd,则SQL查询语句select*fromuserswhereusername='$username'andpasscode='$passwd'变成了:select*fromuserswhereusername=''or1=1or''andpasscode='123'注意:''为两个连续的单引号。可见,字符串'or1=1or'的第一个单引号闭合'$username'的第一个单引号,第二个单引号闭合'$username'的第二个单引号。查询条件or1=1恒成立。在SQL查询语句中,and的运算优先级大于or。故在上述SQL查询语句的where子句中,虽然username=''为假,passcode='123'为假,但是1=1为真,故where子句的条件为永真。在第2种情况下,SQL查询语句则变成了:select*fromuserswhereusername='admin'andpasscode=''or'1=1'其分析与上一种情况类似。从以上分析可以发现,引起Post型SQL注入的根源在于,PHP代码使用了SQL语句拼接的方式进行数据库操作,而拼接所使用的变量由Post方式提交。因此,用户可以通过提交包含特殊SQL分界符等内容,使得正常的SQL查询、更新、插入等语句的结构和逻辑功能发生变化,反而执行了攻击者设计的逻辑,造成对系统破坏或者非授权的访问。【任务3-4】万能密码SQL注入攻击防护在本任务,实现对万能密码SQL注入攻击的防护的四种方式,并验证防护效果。万能密码的防护需要限制用户的输入,可以从两个方面着手。一方面,可以使用正则表达式限制用户输入;另一方面,可以使用PHP的安全函数。3-4-1使用正则表达式限制用户输入使用正则表达式将用户输入限制为指定字符组合。这种处理方式是很多网站普遍采用的方式。在用户注册时,将用户名限制为英文字母、数字和下划线的组合,避免出现单引号等可以引起SQL注入的符号出现,从而避免万能密码攻击。正则表达式的规则说明:头尾两个斜杠/是正则表达式的限定符,表示两个斜杠之间就是正则内容;^和$是行定位符,分别用来匹配字符串的开头和结尾;中括号括住的内容只匹配一个单一的字符,比如[a-z]表示匹配a到z的单个字符;在花括号里面限制字符出现的个数,比如[a-z]{5,16}表示匹配a到z的5到16个字符。使用正则表达式检查用户输入的用户名,需要在文件check_login.php中第14行开始添加如下内容:intpreg_match(string$pattern,string$subject)函数用于执行一个正则表达式匹配。其中参数$pattern为要搜索的模式,字符串形式;$subject为输入的字符串。函数preg_match()在第一次匹配后将会停止搜索,如果出现不匹配的字符将返回0由于正则表达式限制为5到16个字母、数字、或者下划线组合,如果在用户名中输入单引号,或者长度不在范围,都会得到“用户名输入格式错误”的提示。对输入密码的检查可以使用同样的方法。3-4-2使用PHP的转义函数addslashes()函数addslashes()函数返回在预定义字符之前添加反斜杠的字符串mysql_escape_string()或者mysql_real_escape_string()函数二者都是实现转义SQL语句中的字符串中的特殊字符,差别较小。在PHP5和PHP7中升级为mysqli_escape_string()和mysqli_real_escape_string()3-4-3MySQLi参数化查询参数化查询是指与数据库连接并访问数据时,在需要填入数值或数据的地方,使用参数来给值。在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部分来处理,而是在数据库完成SQL指令的编译后,再代入参数运行。因此就算参数中有恶意的指令,由于已经编译完成,就不会被数据库运行。这个方法目前已被视为最有效的SQL注入攻击防护方式。PHP提供了三种访问MySQL数据库的扩展,即MySQL,MySQLi和PDO。MySQL扩展不支持参数化查询,MySQLi和PHP数据对象(PHPDataObject,PDO)这两个新扩展都支持参数化查询。3-4-4PDO参数化查询MySQLi扩展虽然比MySQL扩展更加优化且方便从MySQL扩展迁移,但是它只支持MySQL数据库。PDO扩展对比MySQLi扩展的优点是,它是与关系数据库类型无关的,可以支持十几种数据库扩展,因此可以很方便的切换数据库,比如从MySQL切换到PostgreSQL、MSSQLServer等。【项目总结】本项目以万能密码登录为例,对Post型SQL注入进行漏洞重现、攻击测试和漏洞分析,给出了多种防护方案并进行防护效果测试。攻击测试分析表明,对HTMLPost方式提交的内容,使用传统字符串拼接方式访问数据库是Post型SQL注入漏洞的根源。使用基于白名单的正则表达式过滤用户提交的用户名和密码(如果密码进行了加密或者散列处理则不需要过滤),可以防护万能密码登录漏洞,但防护Post提交的其它变量内容还需

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论