sqli-lab(1~4详解)

    科技2024-05-18  106

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

    SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

    知识点:1,判断是数字型还是字符型,单引号还是双引号 2,union select联合查询注入 3,payload原理与防御措施

    0X0a

    判断注入点及类型 这道题因为是sqli-lab的靶场,所以知道是get型的单引号注入,直接在url栏就可以尝试 通常情况下,加个单引号,使id这个参数不能闭合,通过分析返回的报错信息,来进一步判断 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201007212113129.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2dvbmdqaW5nZWdl,size_16,color_FFFFFF,t_70#pic_center) **单引号判断‘ 显示数据库错误信息或者页面回显不同(整形,字符串类型判断)** 可以看到,单引号没有闭合,返回了报错信息,显示的就是单引号 兄弟萌也可以直接打开源码,通过一步步的比较,进一步学习

    sql语句如上图,id这个参数周围是单引号 and 1=1 / and 1=2 回显页面不同(整形判断) 在数据库中 1=1 和1=2 后面随便输入字符串(相当于1=1和1=2后面的查询语句),发现select 1="1dasd"时返回1正确,1="2dasd"时返回0错误,即select在查询时忽略后面的字符串,只让1和后面第一个数字对比,如果相等就是正确,不相等返回错误。

    0x0b

    **union select联合查询注入** 1,***判断列数*** order by 函数是对MySQL中查询结果按照指定字段名进行排序,除了指定字 段名还可以指定字段的栏位进行排序,第一个查询字段为1,第二个为2,依次 类推。我们可以通过二分法来猜解列数 输入order by 4 --+,页面回显错误,说明不存在第四列

    如此实验2和3,发现3成功,故列数为3

    2,判断页面回显的列数

    回显发现2,3列会被显示

    为什么这里得用-1??为什么2,3被显示了

    因为,程序在展示数据的时候通常只会取结果集的第一行数据,看一下源码,mysql_fetch_array只被调用了一次,而mysql_fetch_array从结果集中取得一行作为关联数组或数字数组或二者兼有,具体看第二个参数是什么。所以这里无论怎么折腾最后只会出来第一行的查询结果。只要让第一行查询的结果是空集,即union左边的select子句查询结果为空,那么union右边的查询结果自然就成为了第一行,打印在网页上了。将id改成-1,使union前面的语句报错,执行后面的,爆出显示位2,3

    3,查库名,得表名,爆列名,获字段

    group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator ‘分隔符’]) 说明:通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号。(具体有点多,请自查,我也不是很懂。。。)

    SCHEMATA表:储存mysql所有数据库的基本信息,包括数据库名,编码类型路径等,show databases的结果取之此表。

    TABLES表:储存mysql中的表信息,(当然也有数据库名这一列,这样才能找到哪个数据库有哪些表嘛)包括这个表是基本表还是系统表,数据库的引擎是什么,表有多少行,创建时间,最后更新时间等。show tables from schemaname的结果取之此表

    COLUMNS表:提供了表中的列信息,(当然也有数据库名和表名称这两列)详细表述了某张表的所有列以及每个列的信息,包括该列是那个表中的第几列,列的数据类型,列的编码类型,列的权限,猎德注释等。是show columns from schemaname.tablename的结果取之此表。

    /注意,查询information_schema中的信息时,使用where语句,那个值不能直接用英文,要用单引号包裹着,当然用其十六进制表示也可以,数值类型的就不用单引号了,这对过滤单引号应该有指导意义。/ (这里并没有过滤,所以没用)

    0x0c payload原理与防御措施

    **1,**为什么要单引号 原理:加单引号是为了让后台SQL语句执行的时候报错,这样,我们就可以初步判断单引号被放在SQL语句中执行了,执行的语句因为有单引号而出错了,方便浑水摸鱼 防御:1、 将单引号过滤或者替换 – 一般程序都是这样做的 2、将单引号转义 – 所谓转义就是让它成为一个普通的字符,而不具备执行功能,php常用addslashes()函数完成这一功能 3、 将服务器设置为不允许爆错或者爆404 not found

    **2,**权限绕过 有俗称的万能语句:SELECT * FROM users WHERE name = ‘’ OR ‘1’=‘1’; 即1=1永远为真 如果这些SQL查询放在权限验证的代码中,那么该代码就会爆权限绕过了。 **3,**多语句执行 最常用的就是union select联合查询注入 UNION 操作符用于合并两个或多个 SELECT 语句的结果集。 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。 比如,SELECT * FROM userinfo WHERE id=1;DROP TABLE users; 删库跑路。。。

    sql注入的防御与绕过还不是很懂,大佬链接

    Less-2 GET - Error based - Intiger based (基于错误的GET整型注入)

    知识点:1,判断是数字型还是字符型,单引号还是双引号 2,union select联合查询注入 3,payload原理与防御措施

    **

    0x0a

    **

    这道题与上道题的唯一区别就是这个是整型,即这个题的id参数没有引号,只是数字,这意味着在你绕过的时候可以不需要对后面的引号过滤(如果没有其他干扰的话)

    这里id=1,虽然回显没报错,但不能确定

    单引号就报错了,有的时候也可能是双引号

    这里后面没有过滤,却成功了,说明这个应该就是整型了

    通过阅读源码,也是很讷到的

    id这个参数只是数字,没有一些过滤,所以确定是整型

    **

    0x0b

    **

    union select联合查询注入也是一样,区别也是id后无单引号,原因就不再说了,前边有

    稍微演示前几步,知道具体区别

    很清楚的知道id=1,后面没有引号

    通过这幅图与上一幅图比较,可以看见当整型数据无其他干扰时,注释符也可以省略,因为不需要注释掉后边的引号

    后面步骤一样,不再啰嗦

    **

    0x0c

    **

    payload的原理与防御措施,还有前边省略的几步,都在我写的less-1中,有详细的说明

    这里也对前边做点补充

    CONCAT()函数 CONCAT()函数用于将多个字符串连接成一个字符串。 使用数据表Info作为示例,其中SELECT id,name FROM info LIMIT 1;的返回结果为 +—-+——–+ | id | name | +—-+——–+ | 1 | BioCyc | +—-+——–+ 语法及使用特点: CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。可以有一个或多个参数。

    GROUP_CONCAT()函数 GROUP_CONCAT函数返回一个字符串结果,该结果由分组中的值连接组合而成。

    使用语法及特点: GROUP_CONCAT([DISTINCT] expr [,expr …] [ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] [,col …]] [SEPARATOR str_val]) 在 MySQL 中,你可以得到表达式结合体的连结值。通过使用 DISTINCT 可以排除重复值。如果希望对结果中的值进行排序,可以使用 ORDER BY 子句。 SEPARATOR 是一个字符串值,它被用于插入到结果值中。缺省为一个逗号 (“,”),可以通过指定 SEPARATOR “” 完全地移除这个分隔符。

    通常情况下,这两个组合来用,对于sql注入,还是挺方便的

    ps:感觉自己会的都只是浅层表面的,内在也不懂,具体逻辑,原理说不太上来

    还请各位大佬评论区留言指教,非常感谢(≥▽≤)/

    Less-3 GET - Error based - Single quotes with twist string (基于错误的GET单引号变形字符型注入)

    知识点:1,单引号字符变形,如:(’’) 2,union select联合查询注入 3,payload原理及防御

    **

    0x0a

    **

    这几个都是类似的,单引号看一下

    通过回显,看到有括号,推测输入的内容存放到一对单引号加圆括号中了,形如select … from … where id=(‘1’) …

    看下源码,能更了解sql注入绕过

    **

    0x0b

    **

    这里与前文一样,也是看下区别就行,具体payload仿照less-1

    **

    0x0c

    **

    这里与前面不一样的就是过滤id参数,(‘’)这种过滤,通过报错回显,可以进一步了解

    这时如果设置成不允许服务器爆错,他不就抓虾,得盲注了,盲注具体后边题详细说

    union select联合查询注入也是一样,拼接语句,多语句执行绕过

    这几篇一起学习,相似地方很多

    Less-4 GET - Error based - Double Quotes - String (基于错误的GET双引号字符型注入)

    知识点:1,双引号字符型的判断

    **

    0x0a

    **

    输入单引号,页面无任何变化,这时候就得考虑双引号了

    输入双引号,页面报错

    根据报错信息判断出输入的内容被放到一对双引号和圆括号中

    打开源码,一探究竟

    第一行将输入的id值再加一对双引号

    第二行将id又加了一对括号

    两次没有放在一块,代码审计得认真

    不过也可以理解为select … from … where id=(”1”) …,这样其实一样

    验证看一下

    **

    1-4总结

    **

    都是基于错误的GET型一次注入,区别只是字符型或整型,单引号还是双引号,有无括号变形

    payload原理和防御措施也是一样,写在前边了,详情见less-1末尾与less-2末尾

    这几个题放一块,方便学习与理解,参照源码,互相比对

    理解错误之处还望不吝赐教,感谢大佬/人◕ ‿‿ ◕人\

    2020.10.9 公瑾

    Processed: 0.023, SQL: 9