0x01 题目介绍
(SQL注入)某应用程序被攻击,请分析日志后作答:
附件:SQL注入.zip
- 黑客在注入过程中采用的注入手法叫布尔盲注。(格式为4个汉字,例如“拼搏努力”)
2. 黑客在注入过程中,最终获取flag的数据库名、表名和字段名是sqli#flag#flag
_。(格式为“数据库名#表名#字段名”,例如database#table#column)
3. 黑客最后获取到的flag字符串为_flag{deddcd67-bcfd-487e-b940-1217e668c7db}。
0x02 解题思路
打开日志文件,可以看到很多日志,substr函数,很明显是布尔盲注。
可以通过下面的查询语句,看到查询的库及表名sqli#flag#flag
172.17.0.1 - - [01/Sep/2021:01:45:55 +0000] "GET /index.php?id=1%20and%20if(substr((select%20flag%20from%20sqli.flag),2,1)%20=%20'r',1,(select%20table_name%20from%20information_schema.tables)) HTTP/1.1" 200 424 "-" "python-requests/2.26.0"
根据布尔盲注的原理及日志中其所使用的语句 其从flag字段一位逐个判断进行读取,可知第一位正确后应开始读取第二位,即每条一句的最后一条是正确的,参考陇剑杯sql注入日志wp(脚本)
# coding : utf-8
import re
from urllib.parse import unquote
file_name = "access_1.log"
pattern_string = "select%20flag%20from%20sqli.flag"
#file_name = input("输入文件名,文件记得要在当前脚本目录下:")
#pattern_string = input("复制个特征值过来,比如select,flag啥的:")
flag = ''
# 打开文件以及读取行数
get_File = open(file_name, "r+")
get_line = get_File.readline()
# 可以通过注入的反馈长度来判断我们需要提取的目标值
while get_line:
get_Data = re.search(pattern_string, get_line)
if get_Data:
get_Data_Num = re.search(r'4[7-8][0-1]?.*', get_Data.string)
if get_Data_Num:
flag += (re.findall(r"%20=%20\'(.+?)\'", get_Data_Num.string))[0]
print(unquote(flag[:-1], 'utf-8'))
get_line = get_File.readline()
get_File.close()