0%

About

本文列出四大安全会议(USENIX、CCS、NDSS和S&P)近5年来与Web安全有关的研究,已发现web方向的研究点。

XSS

研究热点聚焦在DOM-XSS上:

Don’t Trust The Locals: Investigating the Prevalence of Persistent Client-Side Cross-Site Scripting in the Wild, ndss19*

阅读全文 »

搭建漏洞服务

还是先搭一个漏洞的服务吧:新建一个~/Desktop/php/upload文件夹,文件夹下存在如下结构的文件和文件夹:

1
2
3
4
5
6
$ tree
.
├── files
└── upload.php

1 directory, 1 file

upload.php:

阅读全文 »

XSS类型

反射型

用户访问带有XSS代码的请求,服务器立即将代码发送至浏览器,浏览器执行恶意代码:

1
2
3
// http://127.0.0.1/reflect.php?xss=<script>alert(1);</script>
setcookie('session', 'qwerty');
echo $_GET['xss'];
阅读全文 »

注入类型

Union Based

最基本的注入类型,以MySQL为例,假设有注入点:

1
2
SELECT * FROM `test` 
WHERE `username`='admin' and `password`='*';

0x01 判断注入点

阅读全文 »

信息收集是渗透测试的第一步,本文总结目前信息收集的具体操作步骤。

网站信息

whois信息

可以收集到的信息有:

  • 联系人
  • 邮箱(可以到社工库进一步查询)
  • 电话

收集途径有:

阅读全文 »

本地文件包含

1
<?php include($_GET['file']);?>

文件读取

本地文件包含可以作为文件读取使用:

1
2
3
4
5
$ curl http://127.0.0.1/include.php?file=/etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...
阅读全文 »

复习一下PHP中常见的危险函数:

文件读取

  • file_get_contents(),该函数可以读取其他协议造成SSRF

    1
    2
    3
    $src=$_GET['src'];
    $homepage = file_get_contents($src);
    echo $homepage;
  • highlight_file(),高亮显示文件内容

  • show_source(),highlight_file()的别名
  • fopen()、fread(),fgets()、fgetss()、fpassthru()等
    • fread(fopen($filename,”r”), $size); //读取$size长度的文件
    • fgets(fopen($filename, “r”)); //读取一行
    • fgetss(fopen($filename, “r”)); //读取一行并过滤HTML标记
    • fpassthru(fopen($filename, “r”)); //读取到文件结束
  • readfile(),读取文件并返回至页面

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?php
    $file = $_GET['file'];

    if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.basename($file).'"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($file);
    exit;
    }
    ?>
  • file(),把文件读进数组中

  • php_strip_whitespace(),读取一个php文件并返回一个去掉注释和换行的文本,有意思的是,该函数可以去掉任意语言的注释,只要这个语言的注释风格与php相同并且在文件头加入<?php就行可:
    1549526799636
  • parse_ini_file(),只能读取ini文件
阅读全文 »

SSRF成因

SSRF是指存在漏洞的服务器存在对外发起请求的功能,而请求源可由攻击者控制并且服务器本身没有做合法验证,诸如如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?PHP
$url = $_GET['url'];
$ch = CURL_INIT();
CURL_SETOPT($ch, CURLOPT_URL, $url);
CURL_SETOPT($ch, CURLOPT_HEADER, FALSE);
CURL_SETOPT($ch, CURLOPT_RETURNTRANSFER, TRUE);
CURL_SETOPT($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
// 允许302跳转
CURL_SETOPT($ch, CURLOPT_FOLLOWLOCATION, TRUE);
$res = CURL_EXEC($ch);
// 设置CONTENT-TYPE
CURL_CLOSE($ch) ;
//返回响应
echo $res;
?>
阅读全文 »

CSRF成因

GET型

脆弱代码

存在CSRF的GET型请求如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@app.route('/get', methods=['GET'])
def get():
if session.get('user','')=='admin':
ret = "Admin do something!"
else:
ret = "No Privilege..."
return ret

@app.route('/login', methods=['GET'])
def login():
user=request.args.get("user", "Null")
session["user"]=user
template="""
<h3> Login as {{ user }}... </h3>
"""
return render_template_string(template, user=user)


if __name__ == '__main__':
app.run(host='127.0.0.1', port=8888, debug=True)
阅读全文 »

JSONP原理

JSONP(JSON with Padding)是一种跨域获取数据的方法,因为带src属性的标签如<script>允许跨域(1. 在CSP没有设置的情况下, 2.跨域时是可以带cookie的),因此前端可以设置一个callback请求并生成一个访问后台某个<script>的链接,后台在链接中动态的将数据包裹在先前的callback函数中,作为参数返回给前台,这样就完成了跨域获取数据的效果。

阅读全文 »