0%

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函数中,作为参数返回给前台,这样就完成了跨域获取数据的效果。

阅读全文 »

HTTP 请求

  • GET 用于获取数据,无请求body

  • POST 用于添加数据

    其content-type不同,body中的格式也不同

  • PUT 用于添加或更新数据

    Request:

    1
    2
    3
    4
    5
    6
    PUT /new.html HTTP/1.1
    Host: example.com
    Content-type: text/html
    Content-length: 16

    <p>New File</p>

    Response:

    若资源不存在需要创建,那么服务器需响应201表明内容已创建:

    1
    2
    HTTP/1.1 201 Created
    Content-Location: /new.html

    若资源存在则返回200204:

    1
    2
    HTTP/1.1 204 No Content
    Content-Location: /existing.html
  • PATCH 用于更新数据

    Request:

    1
    2
    3
    4
    5
    6
    7
    PATCH /file.html HTTP/1.1 
    Host: www.example.com
    Content-Type: application/example
    If-Match: "e0023aa4e"
    Content-Length: 100

    {"op":"move", "from":"/a/b/c", "to":"/a/b/d"}

    Response:

    正确回应应该为204因为200会带返回body

    1
    2
    3
    HTTP/1.1 204 No Content
    Content-Location: /file.txt
    ETag: "e0023aa4f"
  • DELETE 用于删除数据

    Request:

    1
    DELETE /file.html HTTP/1.1

    Response:

    202已经接受但操作未执行完,204或者200(需返回body)

    1
    2
    3
    4
    5
    6
    7
    8
    HTTP/1.1 200 OK 
    Date: Wed, 21 Oct 2015 07:28:00 GMT

    <html>
    <body>
    <h1>File deleted.</h1>
    </body>
    </html>
  • HEAD 用于获取GET请求的响应头,无请求body

  • OPTIONS 用于描述通信选项,如CORS使用或者获取服务器所支持的方法

  • TRACE 回显服务器收到的请求

阅读全文 »

本文首次发表在Freebuf:https://www.freebuf.com/articles/web/195925.html

同源策略

准确的说,同源策略是指,浏览器内部在发起如下请求时,该来源必须是当前同源的HTTP资源:

  1. 以跨站点的方式调用XMLHttpRequest或者Fetch API。
  2. Web字体(用于CSS中@ font-face的跨域字体使用)
  3. WebGL textures
  4. 使用drawImage绘制到canvas的图像/视频帧。
  5. 样式表(用于CSSOM访问)
阅读全文 »