您的位置:首页 > 数据库

sqlilabs闯关 less-1

2017-10-28 19:19 1151 查看

less 1   GET - Error based - Single quotes -String(基于错误的GET单引号字符型注入)

先说下自己为什么要写这个sqliabs的闯关教程呢

一方面是自己想学习+复习一下sql注入

二来就比较MMP了,之前自己曾去一个业内比较有名的公司面试实习生(自己很菜),到最后让我打sqlilab,这就尴尬了,自己以前没有打过这个靶场,自己的经验也比较少,上去没几关就壮烈牺牲了

三是自从面试被刺激后自己回来搭了靶场,也算是好好打了一段时间,之前有记录了less-7的闯关,然后一拖就拖了好几个月,现在想起来了就想着把这个在好好系统的打打了

 

废话不多了,直接开始吧

因为是less-1,所以说的会比较详细,涉及的点也会尽力提出来,不过自己可能连小白都算不上,每个人也有每个人的方法





加上单引号,发现报错了,查询数据变成了 id=’1’’ 肯定得报错了

因为没有过滤单引号,因此可以闭合来单引号注入了



这里先说一下,mysql中注释符总共有三种

1.      “#”

2.      “-- “(注意—后面有一个空格)

3.      /*...*/

常用的前两种单行注释,最后一种主要用于多行注释

常见的URL编码:

! %21 

" %22 

# %23 

$ %24 

% %25 

& %26 

' %27 

空格一般用+代替

 

好了接着来

现在已经初步判断出有注入了,可以试试猜字段
http://192.168.186.128/sqli-labs-master/Less-1/?id=1'order by 3 %23



并未报错,接着测试



报错显示没有第四列,因此只有3个字段

下面使用union语句来查询

解释一下select后面几个数字的意思,1,2,3,这几个数字是为了凑够和union关键字前面的那个表的字段数一样





为什么没有2,3两个出现呢?

查看源码



看到mysql_fetch_array($result);只调用了一次,这个函数是干什么的呢?



看见了吧,只会取出一行,如果要把所有结果取出来要用循环来取了

在这儿我们只需要让union select前面的查询结果为空集,则后面的自然就成了第一行了

怎样让前面的成空集呢,只需要将id改为表里没有的,或者不合法的额就行,这里改为-1

 

(自己对mysql和php代码也是小白,这些都是参考网上的,请勿喷)



第二列和第三列的结果显示在了页面,但对咱们来说两个位置完全不够啊

怎么办!!!!!!

这时候就要用到数据库连接函数了concat和concat_ws;先看看对于这两函数百度怎么说的吧







这里在数据库里演示一下

Concat



Concat_ws



Cincat_ws的第一个参数是作为分隔符来使用的,但一般第一个参数不是这么传过来的,因为会被html编码,因此需要使用呢mysql中的char函数将十进制ascii码转化成字符

可以这样使用:

concat_ws(char(32,58,32),user(),database(),version()) 

:的十进制ASCII是58

32是空格的十进制ASCII

 

char(32,58,32)即  空格_空格

接着往下做

 

user():返回当前连接数据库的用户

database();返回当前数据库名

version():返回当前数据库的版本

 


下面就是展示真正技术的时候了(真正注入)

Mysql中有个系统数据库叫information_schema,mysql版本大于5.0的有

有哪些数据库、各个数据库有哪些表,每张表的字段类型是什么,各个数据库要什么权限才能访问,等等信息都保存在information_schema表里面

在普及一些知识

Table_schema:数据表所属的数据名

Table_name:表名称

Column_name:列名称

Union select 1,2,table_name frominformation_schema.tables where table_schema="security" %23



这里就要用到limit了,如limit m,n m代表从m+1条记录行开始检索,n代表取出n条数据

不断变化limit的第一个参数即可枚举所有的表,一旦超出范围会返回空集



接下来使用users的列名,我们一般只需要账号与密码

union select 1,2,column_name frominformation_schema.columns where table_schema="security" andtable_name="users" limit 1,1%23







使用limit知道字段有id,username,password

接着最后一步直接注入账号密码

union select1,2,concat_ws(char(32,58,32),id,username,password) from users limit 0,1%23





依旧使用limit即可注出所有的账号密码来

 

因为是第一关所以说的比较详细,把里面可能涉及的知识都说了下,后面的类似的会快一些

因为sqlilab已经被人打烂了,因此非法总会有雷同的,里面涉及的技术只做记录学习请勿用于非法用途,使用后一切责任与本人无关
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: