0x01 题目介绍

(SQL注入)某应用程序被攻击,请分析日志后作答:

附件:SQL注入.zip

  1. 黑客在注入过程中采用的注入手法叫布尔盲注。(格式为4个汉字,例如“拼搏努力”)
    2. 黑客在注入过程中,最终获取flag的数据库名、表名和字段名是sqli#flag#flag_。(格式为“数据库名#表名#字段名”,例如database#table#column)
    3. 黑客最后获取到的flag字符串为_flag{deddcd67-bcfd-487e-b940-1217e668c7db}

0x02 解题思路

打开日志文件,可以看到很多日志,substr函数,很明显是布尔盲注。
image.png
可以通过下面的查询语句,看到查询的库及表名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(脚本)

  1. # coding : utf-8
  2. import re
  3. from urllib.parse import unquote
  4. file_name = "access_1.log"
  5. pattern_string = "select%20flag%20from%20sqli.flag"
  6. #file_name = input("输入文件名,文件记得要在当前脚本目录下:")
  7. #pattern_string = input("复制个特征值过来,比如select,flag啥的:")
  8. flag = ''
  9. # 打开文件以及读取行数
  10. get_File = open(file_name, "r+")
  11. get_line = get_File.readline()
  12. # 可以通过注入的反馈长度来判断我们需要提取的目标值
  13. while get_line:
  14. get_Data = re.search(pattern_string, get_line)
  15. if get_Data:
  16. get_Data_Num = re.search(r'4[7-8][0-1]?.*', get_Data.string)
  17. if get_Data_Num:
  18. flag += (re.findall(r"%20=%20\'(.+?)\'", get_Data_Num.string))[0]
  19. print(unquote(flag[:-1], 'utf-8'))
  20. get_line = get_File.readline()
  21. get_File.close()

image.png

0x03 参考

1.https://www.icode9.com/content-2-1142752.html