权当备战省赛了,以后如果还需要misc应该还能用得到(
后记:事实上并没有去打省赛,后来又去参与了山东省首届数据安全大赛(基本就是misc),还拿了第一名,感觉不亏。

编码

Emoji-AES

21年巅峰极客出过一道题,有emoji还有key:emoji-aes (aghorler.github.io)

语言转换

2022虎符CTF题目。base64解码后发现很奇怪,其实是转换成了小语种,当前的字符集不显示:

1
dOBRO POVALOWATX NA MAT^, WY DOLVNY PEREWESTI \TO NA ANGLIJSKIJ QZYK. tWOJ SEKRET SOSTOIT IZ DWUH SLOW. wSE BUKWY STRO^NYE. qBLO^NYJ ARBUZ. vELAEM WAM OTLI^NOGO DNQ.

可以使用linux下的iconv命令进行编码格式转换,转换到俄文:

1
iconv -f koi-7 1.txt

九键键盘密码

1
93 53 63 71 51 63 41 51 83 63 23 23 93 62 61 94 93 71 41 92 41 71 63 41 51 31 83 43 41 21 81 22 21 74 42

转换脚本:

1
2
3
4
5
str = '93 53 63 71 51 63 41 51 83 63 23 23 93 62 61 94 93 71 41 92 41 71 63 41 51 31 83 43 41 21 81 22 21 74 42'
table = ['abc','def','ghi','jkl','mno','pqrs','tuv','wxyz']
str = str.split(' ')
for i in range(len(str)):
print(table[int(str[i][0])-2][int(str[i][1])-1],end='')

词频分析

SWPU的题:

1
FAKeFlag{59d3U0sr0O5Cbu7f}faKEFLAg{e3fFYfYOU17D5RR5}fAKeFlag{L0B5DcL67DAfA9Io}fakefLAG{6i9BaoUF8f9Lrl0A}FaKefLaG{65CfSUoRUlad5Ue8}FAKEfLAg{RAIo38cyr527F6a4}FaKEfLAg{4US17R0i7645S2Rf}FakeflAG{D8BI8L27r5F1OLL1}FakEFlag{81r9e98o0cdF6D5y}faKEFlAG{IefoSuE7OS58Ooy8}FAkEFLAG{049ou60OuUR756O9}faKEFLAG{d7Orls31EyfUr8ER}FaKefLag{orgca55AU6l8G9C9}FAKeFlaG{OCs9gi2625l5i0g9}FAkeflAg{3F1fio9oArEseYS7}fAkeFLag{Y61yY0iSYr7BR1ae}faKeflAg{9O5rEfUr82RR8517}fAKEfLAg{7o7ii52agDgfYbFc}fAKeflaG{CfRi13ED4Uu3A38i}fAkEfLAG{OgS6BeRu521ellfl}FAkEfLag{f01u7fFLLO5S05AR}FakeFLag{LA8311GoEB4AAcSs}fakEflag{8uI9d2i1Ora52FUa}FaKEfLAG{BFRe9B1l9IrAyA9e}fakEfLaG{e4YUgbl53Y684Ye5}FaKEflAG{95Sl30U1011Osya1}FAKeFlaG{7SrGLSYsyGefYA8L}fAKEfLag{E87bUeeU8oGa72AY}faKeFlaG{AI2s388irYDGF1YA}FakeFLaG{BYA6UO01o3b6YF6f}faKeFLaG{38LuCYo7di0l12s6}FakeFLaG{YoREug5UuY4S6Ofa}fakeFlAG{1OCAeFafI290iis5}fAKeFLAG{y7s4fIAl0es66CSb}faKefLAG{7575Rsf18oi87abd}fAKefLAG{7RYi5E760AGa9a25}FAKeFLAg{ALII88siRGGA2y1a}FakeFLAG{ooL9aa4de53D85iI}faKEflag{G5ii28oGF0ueio55}fAKEFlaG{ig96rDda1iD9er8a}fAKEfLAg{FrG28701AaL8Ul9A}FakefLAG{GYdIiYfGDOiSY6lS}FaKEfLaG{Cuo48Yyb6AB8Io7a}FaKeflAG{d0YCrlOrAI2299bg}faKEfLag{29L478Y83a8CID7f}fakEFlaG{LGrF0E3i3Fa9lEL0}fAkeFlag{i0972LOa8783Y0DA}FAKeFlag{E7DosOrg8fyIfYYa}fAKefLaG{BCB52SoY3Ss2cSU8}fakEFLag{18dC4987A91ra2U5}FakEFLag{G1IY01lg45yu2bUd}

给了非常多的fakeflag,根据括号里互不相干的内容,可以做一个词频统计:

1
2
3
4
5
6
7
8
9
10
11
12
13
from collections import Counter

f = open('附件.txt','r')
str=f.read()
str1=''
for i in range(len(str)):
if str[i]=="{":
str1+=str[i+1:i+17].lower()
cla=Counter(str1)
flag=cla.most_common()
print(flag)
for i in range(len(flag)):
print((flag[i][0]),end='')

流量分析

Web流量分析

TCP 流追踪是通过对网络数据包进行分析,将属于同一 TCP 连接的数据包组合在一起,并以连续的形式展示它们。它显示了 TCP 数据流经过网络的整个过程。

HTTP 流追踪分析网络中的 HTTP 通信。通过对抓包数据进行 HTTP 流追踪,你可以查看 HTTP 请求和响应报文的详细内容,包括请求方法、URL、请求头、响应状态码、响应头以及实际的传输数据。

审查流量包的方式:

追踪TCP流(较少流)、导出HTTP对象(较多流)。

查找与筛选:

http.request.method=="POST",筛选出POST请求的包。(找密码,多存在于POST包里)

查找权限:和whoami相关。

参数解析:

对于admin:

1
2
3
4
5
6
7
-l 被动模式下监听地址ip:port
-s 节点通信加密密钥
-c 主动模式下目标节点地址
--proxy socks5 代理服务器地址
--proxyu socks5 代理服务器用户名(可选)
--proxyp socks5 代理服务器密码(可选)
--down 下游协议类型,默认为TCP,可选HTTP

对于agent:

1
2
3
4
5
6
7
8
-l 被动模式下监听地址ip:port
-s 节点通信加密密钥
-c 主动模式下目标节点地址
--proxy socks5 代理服务器地址
--proxyu socks5 代理服务器用户名(可选)
--proxyp socks5 代理服务器密码(可选)
--reconnect 重连时间间隔
--down 下游协议类型,默认为TCP,可选HTTP

部分存在TLS加密(https)的流量需要用到密钥进行解密,需要有服务器私钥,对应的包为灰黑色。利用首选项里的TLS选择keylog.txt进行解密得到解密的包。

USB流量分析

键盘流量:USB数据在Wireshark的Leftover Capture Data中,八个字节键盘的击键信息在第三个字节中。

当出现0000060000000000时,对应的按键为C。

鼠标流量:USB数据在Wireshark的Leftover Capture Data中,四个字节

第一个字节代表按键,0x00代表没有按键,0x01代表左键,0x02代表右键。

第二个字节代表左右偏移,最高位为符号位,右移为正,左移为负。

第三个字节代表上下偏移,最高位为符号位,上移为正,下移为负。

可以使用kali的tshark进行键盘流量破解:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/usr/bin/env python

import sys
import os

DataFileName = "usb.dat"

presses = []

normalKeys = {"04":"a", "05":"b", "06":"c", "07":"d", "08":"e", "09":"f", "0a":"g", "0b":"h", "0c":"i", "0d":"j", "0e":"k", "0f":"l", "10":"m", "11":"n", "12":"o", "13":"p", "14":"q", "15":"r", "16":"s", "17":"t", "18":"u", "19":"v", "1a":"w", "1b":"x", "1c":"y", "1d":"z","1e":"1", "1f":"2", "20":"3", "21":"4", "22":"5", "23":"6","24":"7","25":"8","26":"9","27":"0","28":"<RET>","29":"<ESC>","2a":"<DEL>", "2b":"\t","2c":"<SPACE>","2d":"-","2e":"=","2f":"[","30":"]","31":"\\","32":"<NON>","33":";","34":"'","35":"<GA>","36":",","37":".","38":"/","39":"<CAP>","3a":"<F1>","3b":"<F2>", "3c":"<F3>","3d":"<F4>","3e":"<F5>","3f":"<F6>","40":"<F7>","41":"<F8>","42":"<F9>","43":"<F10>","44":"<F11>","45":"<F12>"}

shiftKeys = {"04":"A", "05":"B", "06":"C", "07":"D", "08":"E", "09":"F", "0a":"G", "0b":"H", "0c":"I", "0d":"J", "0e":"K", "0f":"L", "10":"M", "11":"N", "12":"O", "13":"P", "14":"Q", "15":"R", "16":"S", "17":"T", "18":"U", "19":"V", "1a":"W", "1b":"X", "1c":"Y", "1d":"Z","1e":"!", "1f":"@", "20":"#", "21":"$", "22":"%", "23":"^","24":"&","25":"*","26":"(","27":")","28":"<RET>","29":"<ESC>","2a":"<DEL>", "2b":"\t","2c":"<SPACE>","2d":"_","2e":"+","2f":"{","30":"}","31":"|","32":"<NON>","33":":","34":"\"","35":"<GA>","36":"<","37":">","38":"?","39":"<CAP>","3a":"<F1>","3b":"<F2>", "3c":"<F3>","3d":"<F4>","3e":"<F5>","3f":"<F6>","40":"<F7>","41":"<F8>","42":"<F9>","43":"<F10>","44":"<F11>","45":"<F12>"}

def main():
# check argv
if len(sys.argv) != 2:
print("Usage : ")
print(" python UsbKeyboardHacker.py data.pcap")
print("Tips : ")
print(" To use this python script , you must install the tshark first.")
print(" You can use `sudo apt-get install tshark` to install it")
print("Author : ")
print(" WangYihang <wangyihanger@gmail.com>")
print(" If you have any questions , please contact me by email.")
print(" Thank you for using.")
exit(1)

# get argv
pcapFilePath = sys.argv[1]

# get data of pcap
os.system("tshark -r %s -T fields -e usb.capdata 'usb.data_len == 8' > %s" % (pcapFilePath, DataFileName))

# read data
with open(DataFileName, "r") as f:
for line in f:
presses.append(line[0:-1])
# handle
result = ""
for press in presses:
if press == '':
continue
if ':' in press:
Bytes = press.split(":")
else:
Bytes = [press[i:i+2] for i in range(0, len(press), 2)]
if Bytes[0] == "00":
if Bytes[2] != "00" and normalKeys.get(Bytes[2]):
result += normalKeys[Bytes[2]]
elif int(Bytes[0],16) & 0b10 or int(Bytes[0],16) & 0b100000: # shift key is pressed.
if Bytes[2] != "00" and normalKeys.get(Bytes[2]):
result += shiftKeys[Bytes[2]]
else:
print("[-] Unknow Key : %s" % (Bytes[0]))
print("[+] Found : %s" % (result))

# clean the temp data
os.system("rm ./%s" % (DataFileName))


if __name__ == "__main__":
main()
1
python UsbKeyboardDataHacker.py ./usbdata 

日志分析

Web响应码是用来表示一个服务器对客户端请求的响应状态的三位数字代码。以下是一些常见的Web响应码及其含义:

  • 200 OK:请求成功,服务器成功处理了请求。
  • 301 Moved Permanently:所请求的页面已被永久移动到新URL。
  • 400 Bad Request:服务器无法理解客户端发送的请求。
  • 404 Not Found:服务器未找到请求的资源。
  • 500 Internal Server Error:服务器遇到了意外情况,导致无法完成请求。

日志文件通常拓展名为.log

一个和web相关的日志分析,诸如(注意url加密):

1
2
3
4
5
6
7
8
9
10
11
172.17.0.1 - - [07/Aug/2021:01:37:51  0000] "GET / HTTP/1.1" 200 638 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"
172.17.0.1 - - [07/Aug/2021:01:37:51 0000] "GET /favicon.ico HTTP/1.1" 404 493 "http://192.168.2.197:8081/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"
172.17.0.1 - - [07/Aug/2021:01:37:55 0000] "GET / HTTP/1.1" 200 637 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"
172.17.0.1 - - [07/Aug/2021:01:37:58 0000] "GET /index.php HTTP/1.1" 200 601 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"
172.17.0.1 - - [07/Aug/2021:01:37:58 0000] "GET /.git HTTP/1.1" 404 457 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"
172.17.0.1 - - [07/Aug/2021:01:37:58 0000] "GET /.git/HEAD HTTP/1.1" 404 457 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"
172.17.0.1 - - [07/Aug/2021:01:37:58 0000] "GET /.git/index HTTP/1.1" 404 457 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"
172.17.0.1 - - [07/Aug/2021:01:37:58 0000] "GET /.git/config HTTP/1.1" 404 457 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"
172.17.0.1 - - [07/Aug/2021:01:37:58 0000] "GET /.git/description HTTP/1.1" 404 457 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"
172.17.0.1 - - [07/Aug/2021:01:37:58 0000] "GET /source HTTP/1.1" 404 457 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"
172.17.0.1 - - [07/Aug/2021:01:37:58 0000] "GET /source.php HTTP/1.1" 404 457 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"

现在来具体分析某条日志:

1
172.17.0.1 - - [07/Aug/2021:01:38:20  0000] "GET /?filename=../../../../../../../../../../../../../../../../../tmp/sess_car&content=func|N;files|a:2:{s:8:"filename";s:16:"./files/filename";s:20:"call_user_func_array";s:28:"./files/call_user_func_array";}paths|a:1:{s:5:"/flag";s:13:"SplFileObject";} HTTP/1.1" 302 879 "-" "python-requests/2.26.0"

时间戳:[07/Aug/2021:01:38:20 0000] 表示该请求发生的时间是在2021年8月7日凌晨1点38分20秒(UTC时间)。

IP地址:172.17.0.1 表示该请求的来源IP地址。

请求方法和路径:GET /?filename=…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/…/tmp/sess_car&content=func|N;files|a:2:{s:8:“filename”;s:16:“./files/filename”;s:20:“call_user_func_array”;s:28:“./files/call_user_func_array”;}paths|a:1:{s:5:“/flag”;s:13:“SplFileObject”;},表示这是一个GET请求,请求的路径是/?filename=../../../../../../../../../../../../../../../../../tmp/sess_car&content=func|N;files|a:2:{s:8:"filename";s:16:"./files/filename";s:20:"call_user_func_array";s:28:"./files/call_user_func_array";}paths|a:1:{s:5:"/flag";s:13:"SplFileObject";}

content参数是用于指定要写入文件的内容。

在PHP语法中,诸如a:2:的字符串,这是PHP序列化字符串的常用的序列化格式。

HTTP版本:HTTP/1.1 表示该请求使用的是HTTP协议的1.1版本。

状态码和响应大小:302 879 表示服务器对该请求的响应状态码是302,响应的数据大小是879字节。

引用页面:“-” 表示该请求没有提供引用页面。

引用页面(Referer)是HTTP请求头部的一个字段,用来表示发送当前请求的页面的URL。当浏览器向服务器发送请求时,会在HTTP头部中包含Referer字段,告诉服务器,该请求是从哪个页面链接过来的。可以防止盗链,分析流量来源,广告追踪。

当HTTP请求中没有包含引用页面(Referer)字段时,通常意味着该请求并没有从一个具体的页面链接过来。例如:

  1. 直接访问:用户可能直接在浏览器中输入URL或使用书签等方式直接访问目标页面,而不是从其他页面链接过来。
  2. 隐私设置:某些浏览器或隐私插件可能会禁用或修改引用页面字段,以提供更高级别的隐私保护。
  3. API请求:某些API请求可能不包含引用页面字段,因为它们并不是通过用户浏览器发起的,而是通过程序或服务间的直接通信。
  4. 恶意请求:某些恶意请求或攻击可能通过修改请求头部来隐藏或篡改引用页面字段,以躲避检测或追踪。

用户代理:python-requests/2.26.0 表示该请求是由python-requests库中的2.26.0版本发起的,这是一个常用的Python库,用于发送HTTP请求。

做题时可以留意一下响应码,200是响应成功的,查找200对应的请求。

SQL布尔盲注

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
172.17.0.1 - - [01/Sep/2021:01:46:06  0000] "GET /index.php?id=1 and if(substr((select flag from sqli.flag),41,1) = 'i',1,(select table_name from information_schema.tables)) HTTP/1.1" 200 427 "-" "python-requests/2.26.0"
172.17.0.1 - - [01/Sep/2021:01:46:06 0000] "GET /index.php?id=1 and if(substr((select flag from sqli.flag),41,1) = 'h',1,(select table_name from information_schema.tables)) HTTP/1.1" 200 426 "-" "python-requests/2.26.0"
172.17.0.1 - - [01/Sep/2021:01:46:06 0000] "GET /index.php?id=1 and if(substr((select flag from sqli.flag),41,1) = 'g',1,(select table_name from information_schema.tables)) HTTP/1.1" 200 426 "-" "python-requests/2.26.0"
172.17.0.1 - - [01/Sep/2021:01:46:06 0000] "GET /index.php?id=1 and if(substr((select flag from sqli.flag),41,1) = 'f',1,(select table_name from information_schema.tables)) HTTP/1.1" 200 426 "-" "python-requests/2.26.0"
172.17.0.1 - - [01/Sep/2021:01:46:06 0000] "GET /index.php?id=1 and if(substr((select flag from sqli.flag),41,1) = 'e',1,(select table_name from information_schema.tables)) HTTP/1.1" 200 426 "-" "python-requests/2.26.0"
172.17.0.1 - - [01/Sep/2021:01:46:06 0000] "GET /index.php?id=1 and if(substr((select flag from sqli.flag),41,1) = 'd',1,(select table_name from information_schema.tables)) HTTP/1.1" 200 426 "-" "python-requests/2.26.0"
172.17.0.1 - - [01/Sep/2021:01:46:06 0000] "GET /index.php?id=1 and if(substr((select flag from sqli.flag),41,1) = 'c',1,(select table_name from information_schema.tables)) HTTP/1.1" 200 426 "-" "python-requests/2.26.0"
172.17.0.1 - - [01/Sep/2021:01:46:06 0000] "GET /index.php?id=1 and if(substr((select flag from sqli.flag),41,1) = 'b',1,(select table_name from information_schema.tables)) HTTP/1.1" 200 479 "-" "python-requests/2.26.0"
172.17.0.1 - - [01/Sep/2021:01:46:06 0000] "GET /index.php?id=1 and if(substr((select flag from sqli.flag),42,1) = '.',1,(select table_name from information_schema.tables)) HTTP/1.1" 200 431 "-" "python-requests/2.26.0"
172.17.0.1 - - [01/Sep/2021:01:46:06 0000] "GET /index.php?id=1 and if(substr((select flag from sqli.flag),42,1) = '.',1,(select table_name from information_schema.tables)) HTTP/1.1" 200 428 "-" "python-requests/2.26.0"
172.17.0.1 - - [01/Sep/2021:01:46:06 0000] "GET /index.php?id=1 and if(substr((select flag from sqli.flag),42,1) = '~',1,(select table_name from information_schema.tables)) HTTP/1.1" 200 428 "-" "python-requests/2.26.0"
172.17.0.1 - - [01/Sep/2021:01:46:06 0000] "GET /index.php?id=1 and if(substr((select flag from sqli.flag),42,1) = '}',1,(select table_name from information_schema.tables)) HTTP/1.1" 200 479 "-" "python-requests/2.26.0"
172.17.0.1 - - [01/Sep/2021:01:46:06 0000] "GET /index.php?id=1 and if(substr((select flag from sqli.flag),43,1) = '.',1,(select table_name from information_schema.tables)) HTTP/1.1" 200 431 "-" "python-requests/2.26.0"
172.17.0.1 - - [01/Sep/2021:01:46:06 0000] "GET /index.php?id=1 and if(substr((select flag from sqli.flag),43,1) = '.',1,(select table_name from information_schema.tables)) HTTP/1.1" 200 428 "-" "python-requests/2.26.0"
172.17.0.1 - - [01/Sep/2021:01:46:06 0000] "GET /index.php?id=1 and if(substr((select flag from sqli.flag),43,1) = '~',1,(select table_name from information_schema.tables)) HTTP/1.1" 200 428 "-" "python-requests/2.26.0"
172.17.0.1 - - [01/Sep/2021:01:46:06 0000] "GET /index.php?id=1 and if(substr((select flag from sqli.flag),43,1) = '}',1,(select table_name from information_schema.tables)) HTTP/1.1" 200 428 "-" "python-requests/2.26.0"
172.17.0.1 - - [01/Sep/2021:01:46:06 0000] "GET /index.php?id=1 and if(substr((select flag from sqli.flag),43,1) = '|',1,(select table_name from information_schema.tables)) HTTP/1.1" 200 428 "-" "python-requests/2.26.0"
172.17.0.1 - - [01/Sep/2021:01:46:06 0000] "GET /index.php?id=1 and if(substr((select flag from sqli.flag),43,1) = '{',1,(select table_name from information_schema.tables)) HTTP/1.1" 200 428 "-" "python-requests/2.26.0"
172.17.0.1 - - [01/Sep/2021:01:46:06 0000] "GET /index.php?id=1 and if(substr((select flag from sqli.flag),43,1) = 'z',1,(select table_name from information_schema.tables)) HTTP/1.1" 200 428 "-" "python-requests/2.26.0"

查看日志发现大量的基于ASCII表的SQL注入,为布尔盲注。

可以从这些注入信息中得到一些参数内容:

1
2
3
172.17.0.1 - - [01/Sep/2021:01:37:25  0000] "GET /index.php?id=1 and if(substr(database(),1,1) = '.',1,(select table_name from information_schema.tables)) HTTP/1.1" 200 422 "-" "python-requests/2.26.0"
……
172.17.0.1 - - [01/Sep/2021:01:37:25 0000] "GET /index.php?id=1 and if(substr(database(),5,1) = ' ',1,(select table_name from information_schema.tables)) HTTP/1.1" 200 472 "-" "python-requests/2.26.0"

正在爆破得到database名,根据爆破的结果可以对应得到database的名字,最后一位如果不存在会逐个遍历一遍再结束。

1
172.17.0.1 - - [01/Sep/2021:01:46:05  0000] "GET /index.php?id=1 and if(substr((select flag from sqli.flag),39,1) = 'O',1,(select table_name from information_schema.tables)) HTTP/1.1" 200 427 "-" "python-requests/2.26.0"

select flag from sqli.flag是一条 SQL 查询语句,用于从名为 “sqli” 的数据库中的 “flag” 表中检索数据。

SQL时间盲注

先来了解一下时间盲注:时间盲注主要利用sleep函数制造时间延迟,根据回显时间来判断结果。

1
GET /Less-10/?id=1" and ascii(substr((select concat(flag) from secret limit 0,1),0,1)) = 39 and sleep(2) --  HTTP/1.1

可以根据wireshark的筛选来得到满足sleep的数据包,例如:http.time>2,这样就能筛选出满足注入要求的数据包,并查找对应的结果。

隐写

NTFS隐写

NTFS交换数据流(Alternate DataStreams,简称ADS)是NTFS磁盘格式的一个特性,在NTFS文件系统下,每个文件都可以存在多个数据流。通俗的理解,就是其它文件可以“寄宿”在某个文件身上,例如,在一个文件夹里我们创建了一个secret.txt文件,并对其进行NTFS隐写:

1
echo flag{7102cbfa-674c-4518-af50-bf5f7b724607} > secret.txt:flag.txt

下面使用dir/r查看文件目录,发现隐藏文件:

1
2
2023/09/23  12:53                 7 secret.txt
45 secret.txt:flag.txt:$DATA

使用notepad可以得到隐藏信息:

1
notepad secret.txt:flag.txt

不只是对文件进行添加NTFS数据流,还可以对文件夹等进行隐写。

文件包含

binwalk 文件名 -e --run-as=root

PDF隐写

在010中查看pdf,发现大量格式由20和09组成的八位字节,提取之后最低有效位组合得到ASCII二进制形式,转换为ASCII可以得到有效信息(20代表0,09代表1)。

可以使用wbStego4.3open工具一把梭哈。

LSB

data extract发现为其他类型文件,直接save bin提取文件。

零宽字符隐写

Unicode Steganography with Zero-Width Characters (mzy0.com)

MP3Stego

音频隐写术:

1
2
Decode.exe -X 文件.mp3/wav
Decode.exe -X -P 文本.txt 文件.MP3/wav

音频LSB

Silenteye工具使用。

audacity频谱

频谱从audacity的每条音轨右边黑色倒三角可以打开,点频谱图。

内存取证

(先等我研究研究这玩意怎么配置环境再来填坑)

volatility

文件格式

mp3

出现文件头FFFB92C0,可判定为mp3文件。

excel

当将 Excel 文件更改为 zip 文件后,将得到一个包含多个文件和文件夹的压缩文件夹。这个压缩文件夹中的内容取决于原始 Excel 文件中的内容和结构。

通常将看到以下一些常见的文件和文件夹:

  1. _rels 文件夹:包含与关系有关的文件。
  2. docProps 文件夹:包含与文档属性有关的文件,如核心属性、扩展属性等。
  3. xl 文件夹:这是最重要的文件夹,其中包含 Excel 文件的主要内容。
    • xl/workbook.xml:包含工作簿的整体结构和元数据。
    • xl/worksheets 文件夹:包含每个工作表的 XML 文件。
    • xl/sharedStrings.xml:包含共享字符串表,用于存储 Excel 文件中的文本内容。
    • xl/styles.xml:包含样式信息,如字体、颜色、单元格格式等。
  4. [Content_Types].xml:定义 ZIP 文件中内容类型和相关关系的文件。

此外,还可能存在其他用于支持 Excel 文件特定功能的文件和文件夹。flag就可以隐藏在这里面。

处理隐写:直接xlsx文件改为zip文件,可以得到excl实际的文件结构。

文件扫描

后门查杀

啥是webshell?

webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种代码执行环境,也可以将其称做为一种网页后门。黑客在入侵了一个网站后,通常会将asp或php后门文件与网站服务器WEB目录下正常的网页文件混在一起,然后就可以使用浏览器来访问asp或者php后门,得到一个命令执行环境,以达到控制网站服务器的目的。

通俗来讲,Webshell是黑客经常使用的一种恶意脚本,其目的是获得对服务器的执行操作权限,

常用的查找后门的工具是D盾:D盾防火墙 (d99net.net)

得到网站或者项目的源代码,用D盾对着目标文件夹一扫即可。

社工

一些小技巧:

图片属性,存在经纬度等。

百度识万物。