web 9
这题打开页面发现一个很复杂的算式,而且每刷新一下算式都会进行变化,并且要求在3秒内完成,所以想着正好锻炼锻炼自己的语言编写能力就试着写了个poc 发现效果还不错,我这里使用了python的selenium模块,使用之前需要先下载Chromedriver 或者火狐的对应文件,然后更改路径为自己的路径就可以了。
import re
from selenium import webdriver
import time
path = "/Users/apple/Downloads/chromedriver" # 这里需要进行修改路径
browser = webdriver.Chrome(path)
url = "http://123.206.31.85:10002/"
browser.get(url)
pageSource = browser.page_source
t1 = time.time()
result = re.findall("(.*?)</p>",pageSource)
result = "".join(result)
final = eval(result)
ele = browser.find_element_by_name("result")
ele.send_keys(final)
browser.find_element_by_xpath("//input[@type='submit']").click()
t2 = time.time()
print("{}s".format(t2-t1))
Code language: PHP (php)
然后就可以直接进行自动化得到flag了,个人感觉还是蛮方便的~
日志审计
下载日志进行观看 不难看出攻击者使用了sqlmap 通过sql注入进行了攻击
192.168.0.1 - - [13/Oct/2018:12:38:14 +0000] "GET /flag.php?user=hence%27%20AND%20ORD%28MID%28%28SELECT%20IFNULL%28CAST%28secret%20AS%20CHAR%29%2C0x20%29%20FROM%20haozi.secrets%20ORDER%20BY%20secret%20LIMIT%200%2C1%29%2C1%2C1%29%29%3D102--%20pZaF HTTP/1.1" 200 327 "-" "sqlmap/1.2#pip (http://sqlmap.org)"
192.168.0.1 - - [13/Oct/2018:12:38:14 +0000] "GET /flag.php?user=hence%27%20AND%20ORD%28MID%28%28SELECT%20IFNULL%28CAST%28secret%20AS%20CHAR%29%2C0x20%29%20FROM%20haozi.secrets%20ORDER%20BY%20secret%20LIMIT%200%2C1%29%2C2%2C1%29%29%3D108--%20pZaF HTTP/1.1" 200 327 "-" "sqlmap/1.2#pip (http://sqlmap.org)"
192.168.0.1 - - [13/Oct/2018:12:38:14 +0000] "GET /flag.php?user=hence%27%20AND%20ORD%28MID%28%28SELECT%20IFNULL%28CAST%28secret%20AS%20CHAR%29%2C0x20%29%20FROM%20haozi.secrets%20ORDER%20BY%20secret%20LIMIT%200%2C1%29%2C3%2C1%29%29%3D97--%20pZaF HTTP/1.1" 200 327 "-" "sqlmap/1.2#pip (http://sqlmap.org)"
这里在日志中通过搜索flag 找到了攻击者的攻击日志
这里可以发现都经过了url编码,然后结果如下
r=hence' AND ORD(MID((SELECT IFNULL(CAST(secret AS CHAR),0x20) FROM haozi.secrets ORDER BY secret LIMIT 0,1),3,1))=97-- pZaF
通过这个可以看出攻击者进行了字符串都拆解,所以我们只需要把后面的数字用提取出来然后转换成字符串就可以了,一下就是我的poc
import re
path = "路径"
with open(path,'r') as file:
res = file.readlines()
for value in res:
str = re.compile("%3D(.*?)\--")
str1 = str.findall(value)
if len(str1) ==0:
pass
else:
print(chr(int("".join(str1))),end = "")
Code language: JavaScript (javascript)
然后运行之后就可以得到flag了
web 13
点开题目发现,发现只有一个输入的内容,在输入框中简单的尝试了一下xss 和 sql注入发现没有,于是看源代码同样的也无法获得相关的信息,那么就burp抓包一下看一下返回包里面有什么东西好了。
Password: ZmxhZ3tjOGY4ZmIzNmEwMzA2ZWM4MmIwMzNhZWViYWFjODViNH0=
发现在返回包中有疑似flag的数据,然后base64解码之后,发现是错的...
解码的内容是:flag{c8f8fb36a0306ec82b033aeebaac85b4}
看了wp知道了是把括号中的数据输进去会出现如下的情况.. 还是我自己太菜了...想的太狭隘..
然后发现是我们速度太慢了,意思就是让我们用脚本来进行这些操作的实现..
代码如下
import requests
import base64
url = "http://123.206.31.85:10013/index.php"
r = requests.session()
result = r.post(url=url,data={'password':'flag'})
result = result.headers['Password']
password = str(base64.b64decode(result),'utf-8')[5:-1] # 这里进行了一个格式的转换比较重要,因为传输过程中用的是字节流 然后我们进行切片或者什么的时候是需要str的
# 这里utf-8 主要是将前面的b进行去除 如果没有utf-8的话就会在最前面出现 b' 这样导致切片的错误
r2 = r.post(url=url,data={"password":password})
print(r2.text)
Code language: PHP (php)