SQL注入就是运用特殊格式的提交数据把SQL命令插入到网页的表单提交或其他数据传输的位置中,
最终达到欺骗服务器,恶意执行某些SQL命令的目的。SQL注入是利用网页中现有的程序,将恶意数据
库操作命令注入后台数据库引擎并执行数据库操作。攻击者可以在网页表单、URL地址、cookie、
数据包等渠道中输入恶意SQL语句,获取运行特定数据库操作命令的权限,而不是按照设计者意图去
执行SQL语句。
SQL注入不仅可以执行恶意的SQL命令,而且也可以执行一些PHP命令。因此SQL注入不仅会危害
数据库中的信息,同时也会对Web网页本身产生破坏。另外根据服务器环境配置的不同以及各种其
他应用的使用情况,攻击者还可能进一步侵害服务器的操作系统。
(1)泄露数据库中用户的隐私信息。
(2)操作数据库从而对某些网页进行篡改。
(3)修改数据库一些字段的值以嵌入木马链接。
(4)操作数据库服务器,窜改系统管理员账号和密码。
(5)得到数据库服务器提供的操作系统支持,让攻击者得以修改或控制操作系统。
SQL注入是利用提交的数据,在原有SQL命令执行时实现恶意命令的运行。交由程序
SQL命令执行的数据有很多,如表单项中填写的数据、页面URL中的get参数、页面
中的post参数、用户Cookie信息等,。
(1)表单项注入。
(2) get参数注入。
(3) post参数注入。
(4) Cookie参数注入。
#表单输入
username: adc
password: 12345' or '1'='1
selecet * from 用户表 where username='$username'
and password=' 12345' or '1'='1 ';
其中 or 比 and 优先级更高,一真为真sql成立
网站具有如下4个特点。
(1)无法通过表单项进行数据交互。
(2)可以接收get形式的变量。
(3)当get参数在数据库中存在时显示用户信息。
(4)当get参数在数据库中不存在时不显示任何用户相关内容。
要想让程序运行出错,首先需要猜测当前网页中所执行的SQL语句大体结构。由于在URL中添加id的值可以改变网页显示的内容,因此判断出当前网页所运行的SQL语句必然以id作为搜索的判断条件。select * from 数据表 where id=’ ’ and [其它判断条件] ;输入的id值会放置在代码"and"之前的单引号当中。测试时所用的id值如果本身带有一个单引号,那么放置程序中执行时就会破坏原SQL语句中引号的配对关系,从而造成程序出错。
selecet * from 用户表 where ='$id''
构造错误语句,在可能为SQl的参数都加上 “ ' ” ,若系统有报错,说明这里是一个注入点
例:
url: http://127.0.0.1/sqli-labs-master/Less-1/?id=1
注入后:
url: http://127.0.0.1/sqli-labs-master/Less-1/?
id=1' and (updatexml(1,concat(0x7e,(select database()),0x7e),1))--+
updatexml(XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串)
第三个参数:new_value,String格式,替换查找到的符合条件的数据
concat()函数
1、功能:将多个字符串连接成一个字符串。
2、语法:concat(str1, str2,...)
0X7e:~ (ascii)
1' and (updatexml(1,concat(0x7e,(select database()),0x7e),1))--+
Cookie值一般是在用户登录成功之后程序自动为用户设置的身份证明,因此本测试需要在已经成功登录的网页上进行。
使用火狐浏览器代理插件(FoxyProxy)
Burp Suite (拦截请求),刷新页面
Cookie: uname=Dumb’
添加“ ’ ” 点击发送,页面报sql语句错误,说明有注入点
Cookie: uname=1234' union select 1,2,database() --+
Burp Suite 点击发送,获取到数据库名字
SQL注入的防御防御思路
避免Web应用被SQL注入的思路是对所有程序接收到的数据进行验证。
验证的内容大致包括如下。
(1)可能造成程序结构改变的标点符号,如",#, +,-
(2) SQL语句中常用的命令字符,如"select"“delete”“insert”“and”“or”“update"等。
(3)验证输入内容的格式合法性,如邮箱地址中必须包含”@“符号、网址中必须带有”."等。
(4)限制所输入信息的长度,如用户名不得少于2个字符且不多于10个字符、密码最多不超过20个字符等。
由于跨站脚本(Cross Site Scripting)英文缩写CSS 与层叠样式表(Cascading Style Sheets)的缩写一样,因此业界人士将跨站脚本英文缩写为"XSS"。网站中如果存样以被XSS 攻击的网页,则证明该网站存在)正在联网识别并。XSS 是目前最普遍的Web应用攻击方法之一,它是一种利用网站漏洞向网页嵌入恶意脚本代码(如JavaScript)的攻击方式。当用户访问网页时,嵌入在网页中的恶意脚本代码将被执行,从而达到攻击用户的目的。
XSS主要攻击目标是浏览器客户端的用户。攻击者首先在网站中留下预定义的恶意脚本,当用户使用浏览器访问站点中的网页时,预留的恶意JavaScript脚本就会对用户、站点造成危害。XSS攻击可能造成的危害大致可分为以下5种。
(1)劫持用户会话。
(2)在网页中插入恶意内容。
(3)盗取各种用户账号。
(4)劫持用户浏览器。
(5)传播、繁殖蠕虫病毒。
XSS攻击时所用到的脚本有3种情况:
(1)直接替换当前网页的已有参数并立即执行;
(2)通过数据提交存储到数据库中,当数据被访问时执行;
(3)写在某个文件中,当文件被打开、引用时执行。根据XSS 的表现形式、存储位置以及有效时长,XSS大致分为反射型和存储型两种类型。
1.反射型XSS反射型XSS是一种非持久性XSS攻击,嵌入的攻击代码般为参数型脚本,通过URL参数或Cookie等方式实现脚本的嵌入。攻击者将恶意脚本嵌入的地址通过各种方式发送给用户,当用户访问网页时,嵌入的恶意脚本就会对用户进行攻击。
2.存储型XSS存储型XSS是一种持续性XSS攻击,嵌入的攻击代码般保存在数据库或文件中,主要的攻击渠道包括网页中的留言板、文件上传插件等。攻击者将带有恶意脚本的内容提交到数据库,或上传到FTP 服务器中当用户在浏览器中访问到带有恶意脚本的内容时,脚本将自动执行来完成攻击。
网站管理人员或用户不可避免地要对网站的某些网页或者内容进行更新,这时就需要使用网站的文件上传功能。如果网站没有对被上传的文件进行限制或者限制被绕过,文件上传功能便有可能被攻击者恶意利用。文件上传攻击是指网站没有对上传的文件进行严格地验证和过滤,攻击者将恶意的可执行文件或脚本上传到服务器中,从而控制整个网站,甚至导致服务器沦陷。
根据攻击者所上传文件的功能不同,文件上传攻击对Web应用及服务器产生的损害程度也各不相同,主要造成的危害如下。
(1)上传病毒文件,使网站及服务器雍疾。
(2)执行数据库指令,获取机密信息。
(3)使用木马文件,盗取网站管理员账号。
(4)通过后门程序,完全控制目标网站。
(5)运用系统指令,远程控制目标服务器。
(6)控制同服务器下的其他网站。
http://192.168.154.138/DVWA-master/hackable/uploads/test.php
Apache 多扩展名漏洞存在于Apache 1.x和Apcahe 2.x的各个版本中。当Apache解析服务器中的文件时,如果遇到无法识别的扩展名会忽略该扩展名,之后以从右到左的顺序检查文件名中的字符,直到查找出可识别的扩展名为止。
例如,将文件"1.php.aaa.bbb"放置在 Apache 配置的网站目录下。使用浏览器访问网站时,Apache会从".bbb"位置开始尝试解析,“.bbb"不属于Apache能解析的扩展名,那么Apache 就会忽略”.bbb",尝试解析I1.aaa"。同理".aaa"也不属于能解析的扩展名,Apache会继续向前检查文件名,直至找到.php"。最终文件"1.php.aaa.bbb"会被识别为PHP文件,以网页形式打开。
IIS文件名截取漏洞存在于IIS6.0版本中。当IIS解析服务器中的文件时,如果文件名中含有";“且”;“左侧有符合扩展名格式的字符串,那么”;“会被IIS视为文件名称的结束符,并且忽略”;“后方的字符串。
例如,文件"1.asp;.jpg"本质上是一个名称为"1.asp;“的jpg格式图片。但是使用IIS 6.0来识别此文件时,文件名中的”;“会被认为是文件名称的结束符,故IIS判断该文件为"1.asp”,后方的”;jpg"则被忽略。最终"1.asp;.jpg"被当作ASP网页文件执行。
Nginx空字节漏洞存在于一些旧版本的Nginx中,具体包括Nginx 0.5.x. Nginx 0.6.x. Nginx 0.7->0.7.65, Nginx 0.8>0.8.37。在以上Nginx版本中,任意文件的文件名后方添加"%00.php",则文件会以PHP 形式被解析。如果将"00"看作ASCI码,其对应的字符恰好是ASCII表中的第一个字符null,null表示"空",是一个不可见字符,因此本漏洞被称为Nginx空字节漏洞。
例如,“123.jpg"是一个普通图片文件,将其放置在具有Nginx空字节漏洞的Web容器中。使用浏览器访问该图片文件时,如果路径中的文件名称为"123.jpg”,浏览器将正常显示图片中的画面,如果路径中的文件名为"123.jpg%00.php",那么浏览器会强制以PHP形式解析图片文件,将图片文件中的源代码显示在网页中。
(1)尽量不要使用已知带有文件解析漏洞的Web容器。
(2)完善文件过滤机制,禁止文件名中出现两个或两个以上"."符号。
(3)除存在安全隐患的文件扩展名以外,还要禁止文件名中存在 “;” "%"等易成文件解析攻击的符号。
(4)将用户上传的文件与网站服务器分离,保存在独立的文件服务器中。
跨站请求伪造攻击也被称为"one-click attack"或者’session riding", 缩写为"CSRF"或者"XSRF"。
CSRF是一种挟持用户在当前已登录的Web应用程序上执行非本意操作的攻击方法。
CSRF攻击是攻击者冒充其他用户的身份,以受害用户的名义进行各种操作,具体危害如下。(1)以受害用户的名义发送邮件。
(2)以受害用户的名义发送即时信息或留言。
(3)操作受害用户的账户进行转账或购买商品。
测试人员将渗透测试一个某银行网站系统,下面将举例说明CSRF攻击的流程。测试用户A向测试用户B进行转账操作,测试用户A向服务器发送请求时,请求中必须包含的信息有以下3点.
(1)测试用户A的账户验证信息,证明转账操作是从测试用户A发起的。
(2)测试用户B的账号或id值,告诉服务器钱具体转到谁的名下。
(3)具体转账金额,让服务器知道在双方余额数字上进行怎样的加减运算。
分析上面的3个必要信息,其中"测试用户A的账户验证信息"在测试用户A登录银行网站系统之后就已经完成,因此该信息通常会以Cookie的形式保存下来,并且在一定时间内持续有效。"测试用户B的账号或id值"及"具体转账金额"是在测试用户A登录银行网站系统之后手动填写的,那么这两个信息就会在测试用户A提交转账请求时,以get参数或 post参数的形式发送到服务器。
直接访问连接并修改参数,就可以修改密码
http://192.168.154.138/DVWA-master/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#
1.网站开发者
(1)添加临时身份验证令牌(token)验证开发人员可以在HTTP 请求中以参数的形式加入随机的token,并在服务器端建立拦截器来验证该token。如果请求中没有该token值或token值不正确,则判定为CSRF攻击,拒绝请求。
(2)二次验证二次验证就是在转账等关键操作之前要求用户提供当前账户的密码或验证码。二次验证可以有效防御CSRF攻击。
2.网站用户每个用户在学习网络安全知识的同时,能够养成良好的上网习惯,可以很大程度上减少CSRF攻击的危害,例如以下的一些上网习惯。
(1)上网时不要轻易进入内容未知的网站。
(2)不要轻易单击论坛、聊天室、即时通信工具及邮箱中出现的链接或图片。
(3)及时退出长时间无操作的已登录账户。
(4)涉及金钱、隐私的网站,尽量在退出登录的情况下再访问其他网站。
(5)如果需要单击未知链接的图片,首先确保各种会员、账户都处于退出状态。
(6)安装合适的防火墙及杀毒软件。
(7)保证安全防护软件的及时更新。