你👱🏻‍滴快乐寒假 开始辽
因为你👱🏻‍再摸鱼滴话就要get out了

[ACTF2020 新生赛]BackupFile

你👱🏻‍打开看了下 发现没什么东西 查看源代码也是什么都没有 估计得用tool了

这个绿色的再次勾引你👱🏻‍进行download

你👱🏻‍进行一个代码拷打,这里是弱比较

必须沾点走近科学了

弱比较:如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行,在比较时该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。所以直接传入key=123就行

所以get输入?key=123就能轻松拿下

[护网杯 2018]easy_tornado

这题你👱🏻‍在攻防世界上其实就做过,多少沾点朝花夕拾了

这里分别给了你👱🏻‍3个线索

第一个是告诉你👱🏻‍flag在fllllllllllllag

第二个render是告诉你👱🏻‍这是模板注入

第三个是告诉了filehash值的计算公式

render是啥呢

render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页 render配合Tornado使用

Tornado又是什么贵物捏

Tornado是一种 Web 服务器软件的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。

你👱🏻‍首先尝试了一下python模板注入,后面发现这里其实是报错注入

但你👱🏻‍后面换成1*5之类的都是ORZ,你👱🏻‍搜了一下官方文档后再次构造

这里拿下了cookie_secret

你👱🏻‍这里写了脚本来加密

import hashlib
hash = hashlib.md5()

filename='/fllllllllllllag'
cookie_secret="16ec01bd-d49e-4866-b84b-ffa1d4e2c574"
hash.update(filename.encode('utf-8'))
s1=hash.hexdigest()
hash = hashlib.md5()
hash.update((cookie_secret+s1).encode('utf-8'))
print(hash.hexdigest())

这里得到加密后的结果后写出payload
file?filename=/fllllllllllllag&filehash=83480a45a0441196606757575ec3ea59

得到flag

[极客大挑战 2019]BuyFlag

又是这SYCLOVER 前端基本上都没变一下只不过这里多了一个payflag环节

你👱🏻‍查看源代码,看到了这个

这里要post一个password为404过去而且password不能是数字,所以是404a

但是你👱🏻‍用hackbarPOST了过后没回显,你👱🏻‍无奈了只能用burpsuite。

这里cookie的user 按理说应该是1,因为正常情况下这里是应该要得到回显的

这里你👱🏻‍传入password=404a和money=100000000,成功登入但是提示我数字太长,于是该用科学记数法。

这里最开始抓的包是GET,需要改成POST,不能直接把GET换成POST而是需要用这个改

这里成功拿下flag

[HCTF 2018]admin

这道题你👱🏻‍开始试着账号叫admin 密码叫123登陆 直接拿到flag结束
但是你👱🏻‍既然是专门刷题的,那必须玩儿明白了

这里你👱🏻‍还是走正常流程,先注册个号登进去,进去后有index,post,change password,logout

你👱🏻‍在changepassword这里找到了失落滴宝藏,于是摸过去

这个代码量是目前你👱🏻‍见过的最多的了,而且这个知识点也是你👱🏻‍以前从来没接触过的那种,终于在提示下找到了config.py里面的密钥为ckj123,为什么要密钥呢,因为这里需要对flask session进行伪造,而flask的session在客户端里,所以可以整活,而破解需要密钥。

而这道题就是要你👱🏻‍用admin的身份进行登录。

这里找到密钥为ckj123

通过登录成功抓包到session

将session解密

这里将name更换成admin后进行再加密

这里拿到flag

其实你👱🏻‍做出来了仔细想想原理还是挺简单的。

什么事后诸葛亮

这个加解密脚本是你👱🏻‍偷的 地址在这里

https://github.com/noraj/flask-session-cookie-manager

[BJDCTF2020]Easy MD5

你👱🏻‍查看源代码 发现这里是GET传参

这里看消息头可以看到提示

关于password=md5($pass,true)

这里你👱🏻‍是看wp的时候搬运的

首先说一下关于md5(string,raw)的定义,

content: ffifdyop

hex: 276f722736c95d99e921722cf9ed621c

raw: 'or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c

string: 'or'6]!r,b

这里需要注意的是,当raw项为true时,返回的这个原始二进制不是普通的二进制(0,1),而是  'or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c  这种。

   上面的’ffifdyop‘字符串对应的16位原始二进制的字符串就是”    'or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c    “  。  '  \  '后面的3个字符连同'  \  '算一个字符,比如’    \xc9    ‘,所以上述一共16个。当然,像’    \xc9    ‘这种字符会显示乱码。

   然后我们可以用’ffifdyop‘带入,看一下实际的效果。

这里32位的16进制的字符串,两个一组就是上面的16位二进制的字符串。比如27,这是16进制的,先要转化为10进制的,就是39,39在ASC码表里面就是’ ‘ ‘字符。6f就是对应‘ o ’。

然后我们得到的sql语句就是 SELECT * FROM admin WHERE username = ‘admin’ and password = ‘’or’6�]��!r,��b’

为什么password = ‘’or’6�]��!r,��b’的返回值会是true呢,因为or后面的单引号里面的字符串(6�]��!r,��b),是数字开头的。当然不能以0开头。(我不知道在数据库里面查询的时候,�这种会不会显示)

这里引用一篇文章,连接在下面,里面的原话“a string starting with a 1 is cast as an integer when used as a boolean.“

在mysql里面,在用作布尔型判断时,以1开头的字符串会被当做整型数。要注意的是这种情况是必须要有单引号括起来的,比如password=‘xxx’ or ‘1xxxxxxxxx’,那么就相当于password=‘xxx’ or 1 ,也就相当于password=‘xxx’ or true,所以返回值就是true。当然在我后来测试中发现,不只是1开头,只要是数字开头都是可以的。

当然如果只有数字的话,就不需要单引号,比如password=‘xxx’ or 1,那么返回值也是true。(xxx指代任意字符)

表里就只有一条数据,用于测试。

所以到这里为止,就完成了sql注入。同时要注意的是,这种sql语句,在mysql里面是可以行得通的,但是在oracle数据库里面这样的语句是有语法错误的。

所以回过头来为什么ffifdyop就是答案,因为ffifdyop的md5的原始二进制字符串里面有‘or’6这一部分的字符。那么进一步思考这个单引号是否是必要的,这两个单引号是为了与原有的语句的单引号配对。所以我们理解了这个sql注入的原理,那么就明白了我们需要怎样的字符串。

所以你👱🏻‍输入ffifdyop后跳转了页面

你👱🏻‍查看源代码发现这里是md5弱碰撞

你👱🏻‍找了一对md5相同的字符串 Get传参

?a=QNKCDZO&b=s155964671a

跳转到下一个页面 这里是md5强比较

数组进行绕过,因为md5不能处理数组,所以md5(param1[])返回false,===两边都返回false,自然就相等(同样弱比较也可以用数组绕过进行操作)

得到flag