基础回答
(1)SQL注入攻击原理,如何防御
- web应用程序对用户输入数据的合法性没有判断,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
blind SQL injections
- content based SQL injections:先测试可以进行盲射,可以则通过内容得到数据库的相关信息
- time based SQL injections
防御方法:
设置输入字符检测与限定
(2)XSS攻击的原理,如何防御
与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制,获取用户的一些信息。
防御方法:
- 编码:对用户输入的数据进行html Entity编码
- 过滤:移除用户上传的DOM属性,如onerror等,移除用户上传的style节点,script节点,iframe节点等。
- 校正:避免直接对HTML Entity编码,使用DOM Prase转换,校正不配对的DOM标签。
(3)CSRF攻击原理,如何防御
CSRF攻击:让用户在不知情的情况下攻击自己已登录的一个系统,类似于钓鱼
防御方法:
- 检测用户提交。
- 不要暴露用户隐私信息。
- 使用post 操作 。
- 严格设置cookie的域。
实验
安装Webgoat
0.说在前面
- 一开始搜了各种网上安装教程,也参考了README教程(这个真的非常实用),中途遇到乱七八糟的问题,最后都一一解决了,到最后一步,对Webgoat安装包进行安装,漫长的安装等待,最后出现错误提示......(掀桌)
- 后来发现是搜的教程都是webgoat7的,对最新的webgoat8并不适用,接下来进入安装webgoat8的方法。
1.配置安装前环境
- 确认已安装jdk8.0以上的版本
- 查看命令:
java -version
- 没有安装则参考教程进行安装
2.在官网下载Standalone安装版本
-
(README.MD文件是我前面尝试源码安装的时候安装包里自带的)
-
下载地址:
https://github.com/WebGoat/WebGoat/releases
-
安装命令:
java -jar webgoat-server-<<version>>.jar
(端口默认为8080) -
以上的详细步骤参考Webgoat8安装教程
-
在浏览器里输入地址
127.0.0.1:8080/WebGoat
打开WebGoat -
自此Webgoat安装成功
进行实验
- pm_silencer
- monarchpm
Injection Flaws: SQL Injection(advanced)
-
该板块学习内容是基础SQL和盲射
-
一顿学习后...
知识点
基本注入
union注入
盲注
通过union你能跨表执行 SQL 查询。 基本上你可以污染(注入)查询使它返回另一个表的记录。
SELECT header, txt FROM news UNION ALL SELECT name, pass FROM members
这个查询会联结并返回 news 表和 members 表的所有记录。
实践1:Pulling data from other tables
-
题目要求:输入SQL语句找到该数据库中的另一张表,得到该表中Dave的密码
-
输入语句:
\'; select * from user_system_data--
-
可以看到有dave这个人,密码为dave
-
觉得这张表看的难受,也可以这样搜寻:
; select password from user_system_data where user_name=\'dave\'
-
验证
-
实验成功(喜极而泣QAQ)
实践2:blind SQL injections(待)
-
blind SQL injections分类
-
content based SQL injections:先测试可以进行盲射,可以则通过内容得到数据库的相关信息
-
time based SQL injections
实验过程:
确认哪个输入框可以进行盲注攻击
-
(1)尝试在注册板块进行blind SQL injections,经测试邮箱输入框无法进行盲注
-
(2)尝试在登陆模块使用blind SQL injections,同样无效
-
(3)尝试注册一个姓名为tom的账户,返回信息显示tom用户已存在,说明tom在某个数据表中
-
(4)尝试注册一个姓名为\'and 1=1--的账户进行盲注(值为假),显示注册成功??
-
(5)尝试注册一个姓名为\'or 1=1--的账户进行盲注(值为真),显示已经存在账户
-
到此可以确定注册登录名的输入框可以使用盲注进行攻击
-
另,在尝试过程中,有提示说输入长度不能大于30
确认查询的是什么数据表
- 原谅博主是个SQL半入门者QAQ,这一步试了挺久还没有做出来
利用注册登录名输入框进行盲注
- 如果上面一步做出来了,计划下一步的做法如下:
- 通过
tom\' and (substring((select 密码 from 数据表 where 用户名=\'tom\'),1,1)=\'a\';--
不断试,最终得到tom的密码
后续
-
这是我的初步解题想法,做到第二步就卡壳了,,后来在网上搜寻了一番,发现了一个做法
-
前面的做法与我大致相同,都确认了注册登录框存在SQL盲注,后面怎么做它给出了一个建议(好像也没做出来?)
-
等我把webgoat换成开发板的时候再进行尝试......
Injection Flaws: SQL Injection
-
一顿学习后......
实践3:String SQL Injection
- 题目和答案如下图,解析参照该模块教程的上一页
实践4:Numeric SQL Injection
- 题目和答案如下图,解析参照该模块教程的上上一页
Injection Flaws: XXE Injection
-
利用XXE(XML External Entity attack)漏洞进行攻击
-
用户的输入被程序当成XML语言解析
-
XML经常被用作于程序的配置文件和数据的存储文件
-
XML entity分类
-
internal entities
-
external entities (利用的是这个)
-
parameter entities
实践5:XXE Injection
- 此处允许用户对图片发出自己的评论,要求利用XXE注入漏洞列出该服务器的root目录。
- 做这道题的方法应该是,构建一个读取/etc/passwd文件的XML,内容为:
<?xml version=\'1.0\'?>
<!DOCTYPE any[<!ENTITY reborn SYSTEM "file:///etc/passwd">]>
<comment>
<text>&reborn;</text>
</comment>
- 这样&reborn取值后最终会返回显示在评论中
然而因为我并不能修改这些,所以我尝试在输入框里输入
</text></comment>
<?xml version="1.0"?><comment>
<!DOCTYPE any[<!ENTITY reborn SYSTEM "file:///etc/passwd">]>
</comment>
<text>&reborn;
进行修改,但看结果可以推断这个XML语法并不通过......
-
再在自己的机子上新建一个xml文件进行测试
-
说是XML的描述只能放在文件开头,我这样写是无效的
-
去掉第二个再试一次
-
后面的某个模块重复了?
-
试试只有一个comment模块
-
好像可以了
-
在输入框里再试一次:
</text></comment>
<comment>
<!DOCTYPE any[<!ENTITY reborn SYSTEM "file:///etc/passwd">]>
</comment>
<text>&reborn;
-
还是不行...,看来还是得在开发板上做
-
预计效果
Authentication Flaws:JWT tokens
- JWT tokens格式:
header.claims.signature
- 攻击原理:在步骤5可以得到相关信息
实践6:JWT cracking
-
在base64解码网站上对其进行解码,结果如下:
-
可以看到这个用户是Tom,拥有主管、项目负责人的权限
-
题目要求换个用户,重新签名后输入,但问题是,,私钥怎么获得呢...,这个查询的又是哪个数据表...
Authentication Flaws:Password reset
实践7:Security questions
- 问题描述
- 通过已知用户名密码得到另一个用户的密码
- 根据已知信息去试即可
Cross-Site Scripting(XSS): Cross Site Scripting
- 攻击者通过在页面链接中插入恶意代码,当受害者浏览该页面时就能够盗取用户信息。
- 分类:持久型跨站(存储型)、非持久型(反射型)、基于DOM的跨站。
实践8:Using Chrome or Firefox
要求再开一个跟当前网页一样网址的标签,在两个标签下都输入javascript:alert(document.cookie);
语句看两者的cookie有什么相同点
-
可以发现它们的JSESSIONID都是一样的
实践9:Reflected XSS
要求找到可以使用XSS攻击的输入框
-
尝试成功
Insecure Deserialization:Insecure Deserialization
知识点
什么是serialization
deseralization是前者的反面
- only data is seialized. code is not serialized itself.
- deserialization creates a new object and copies all the data from the byte stream.
Request Forgeries:Cross-Site Request Forgeries
-
CSRF:当一个恶意网站引起一个用户的浏览器在一个信任的站点执行了一个有害的行为时,CSRF发生了。
-
与XSS相反,XSS利用了一个用户对一个特殊站点的信任,而CSRF利用一个站点对一个用户的信任。
Client side:Client side filtering
- 客户端过滤
- 教程参考
实践10:Salary manager
-
要求找到隐藏的经理信息
-
方法:查看源代码,其中表格内容对应代码