CUMTCTF-寒假赛出题题解

web

EZsqli

有一个注册页面,一个登录页面

首先尝试闭合引号

username=1234'
password=123

返回

注册成功hello, 1234\' 

实际上,我在这里做了过滤,无法进行直接注入,(登录界面也是一样)源码:

 $name= mysql_real_escape_string($_POST['name']);//post获取表单里的name
 $password= mysql_real_escape_string($_POST['password']);//post获取表单里的password

对几个特殊字符前加’\'防止注入

这道题无法直接注入的原因就是单引号无法闭合,因此得想办法闭合掉单引号

注册时将用户名设置长度超出限制时会截断(这里我设置的是30个字符),长度限制需要自己测试

登录时需要sql语句查询用户名信息

 $sql = "select * from web1.user where username = '$name' and password='$passowrd'";//检测数据库是否有对应的username和password的sql

因此可以利用这个截断转义掉$name后的 ’

将用户名设置为

username=123\\\\\\\\\\\\\'

这样经过过滤后截断为

注册成功Hello,123\\\\\\\\\\\\\\\\\\\\\\\\\\\

这里正好截断到 ’ 前的 \ ,注意,这里的这个 \ 是过滤函数加上去的,因此上面那个构造的username当作用户名,可以实现转义单引号的目的

因为登录成功后会回显password,因此password可输入sql注入语句

首先测试回显位置:

password=union select 1,2,3#
select * from web1.user where username='123\\\\\\\\\\\\\\\\\\\\\\\\\\\' and id=' union select 1,2,3#'//实际上此时的username='123\\\\\\\\\\\\\\\\\\\\\\\\\\\' and id='

实际注入时password还有过滤

$list=array(" ","or","select","and","union");
$passowrd=str_ireplace($list,"",$passowrd);

因此

password=uniunionon/**/seleselectct/**/1,2,3;#
hello,your password is 3

因此在3位置注入即可

这里还有一个有点意思的地方

由于password里也无法包含引号,因此表名flag已经给出,这里可以猜测一下字段名也是flag(比赛时大胆猜一下往往能省很多时间)

还有一件事

web1库里的flag表中的flag是假的,真的flag在另一个数据库的flag表里,这里本来是想提醒大家sql注入时除了习惯性的用database()代替当前库名以外别忘了看看用户权限下的其他数据库

select group_concat(SCHEMA_NAME) from information_schema.SCHEMATA

结果这题0解。。。。emmmmm。。。。。。

Crypto

出来签到啦

题目分为两层,具体原理见参考链接
第一层为 AES ,脚本运行( python2 )得出 flag
cipherText1 , cipherText 转换为 16 进制,通过 winhex 打开即为 16 进制

from Crypto.Cipher import AES
def xor(p1, p2):
tmp = ''
for i in range(len(p2)):
tmp += chr(ord(p1[i]) ^ ord(p2[i]))
return tmp
def pad(plainText):
return plainText + (chr(len(plainText)) * (16 - (len(plainText) % 16)))
key = "19e6855d293a1b76ff44f18948b19bad".decode("hex")
cipherText1 ="97FB685D28FC895BB1617CDA1E6C4D76".decode("hex")
cipherText = "D0EC67CCCF6B2BB057C4FAA168FA670C12CBB3D5D058968FF60426F95344A84B".decode("hex")
plainText ="Can_You_Find_me?"
fakeIV = "aaaaaaaaaaaaaaaa"
fakeIVAes = AES.new(key, AES.MODE_CBC, fakeIV)
fakePlainText = fakeIVAes.decrypt(pad(cipherText1))
enc_msg = xor(fakePlainText, fakeIV)
iv = xor(enc_msg, plainText)
print len(iv)
print "iv is : " + iv
aes = AES.new(key, AES.MODE_CBC, iv)
flag = aes.decrypt(pad(cipherText))
print flag

原题参考: https://www.cnblogs.com/crybaby/p/12940219.html

这里说一下py3和py2的一个区别,py2里边字符串和bytes类型都是以字节处理的,因此只要字符串内容符合16进制形式可以直接decode转化为bytes类型,而py3里字符串是以单个字符(unicode)处理,因此不能直接转化,具体如何更改为py3代码大家自己去了解一下

第二层为线性反馈移位寄存器( LFSR ),需要用第一关得到的 flag 作为 challenge2.zip 的解压密码(注意不是整个 flag, 而是 {} 里边的内容)同样运行脚本( python2 )可得 flag
result 文件用 winhex 打开,因为 result 需要转化为二进制

mask = '1001000000100000001000100101'
result = '10000001011110100100011111000000100100100110010000100110111001010001110110110101100111011110101010111110010111110000101101000111110101110100011101111110110100010110011001011010010011000001110111100101011110111010001110111101001010000100010111100110010101101000000011111000001001111010011010010010100001000010111010111010010010100000000100000000011101001101100101011001111110010111110110010111010010010001000010011001010101101011101000011001100000001000001100000001000101000001010000111010001010011001001011000010001101111000001001000001101011011000011101010001111111101110010111011010000001010110001100000110101001101000011001001101000101100100100100011100010110011000010101100001101111100110111001000010111011101110100001001000100000101010010000101000100100111011010010010101010110110001011111011000' #result 代表输出的 lastbit 序列
tmp=result # 将 result 的值赋给 tmp
R = '' #R 即为要求的 flag 的括号内的值
for i in range(28):
output = '?' + result[:27] #s[i:j] 表示获取 a[i] 到 a[j-1]
ans = int(tmp[27-i])^int(output[-1])^int(output[-3])^int(output[-6])^int(output[-10])^int(output[-18])^int(output[-25]) # 由反馈函数推导而来
R += str(ans)
result = str(ans) + result[:27] # 更新 result 在 output 中显示的序列
R = format(int(R[::-1],2),'x') #s[::-1] 是从最后一个元素到第一个元素复制一遍(反向)
flag = "bxsyyds{" + R + "}"
print flag

原题参考: https://www.anquanke.com/post/id/181811

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值