结果是hello,_用户名_ __email_ 这里可以看出查询了两个字段 SQL语句构造应该是:select 字段1,字段2 from 表 where id =1 那我们如何获得表的其他数据呢?(爆表) 这里就可以构造payload了1 or 1=1 (在SQL中or是如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。1=1是永久返回为真,就是where 后面输入的值永远为真,也就可以将表中所有内容给遍历出来了) 因为是post方法,我们使用hackbar进行post提交 这样一次完整的SQL注入就完成了 2x00找到SQL注入
由于我们很难访问到应用的源代码,不知道设计者如何设计的,因此我们需要找到SQL注入,需要借助推理进行测试。借助推理进行测试的基本原理原理就是:向服务器发送请求,然后检测查看其中的异常。 2x01通过SQL错误来找到SQL注入 在靶场中我们可以通过看源码知道这个web应用的构造,但是在生活中,我们绝大多数碰到的是不开源的web应用,我们对于内部构造是完全不清楚的,这样我们如何进行SQL注入呢?我们往往采用一种让SQL报错的方式来猜测内部构造,以达到找到注入点的目的,这次我们使用字符型注入来为大家演示什莫是基于报错的SQL注入的查找方式。 例子: 对于字符型的注入,对于这类需要符号修饰的我们构造payload原则是:闭合测试、构造合法SQL、欺骗后台,基于以上三个原则,我们的payload就是这样的:xxx (符号闭合) or 1=1(注释)。 但是,首先还是一个输入框,首先我们不知道输入的是字符还是数字,我们就可以用报错机制来判断出来,正常SQL中字符和数字的区别是数字不用’’或者””来修饰,而字符需要修饰,我们就需要判断两次,第一:这个输入框是数字型的还是字符型的。第二:如果是字符型的话它是“”还是‘‘修饰的
这个错误的意思是列名不存在,从这个错误我们就知道了,SQL服务器认为这个值不是一个数字,那末就是一个列,然后SQL就去寻找这个列,然后当然找不到了,然后就返回报错了,这里我们就可以判断出应该输入一个什莫样的类型 然后知道什莫类型之后我们判断是“”还是‘’ 查询后是这个画面 失败了,这个表示这个双引号并没有进入到数据库服务器里面,也就是存储层,我们再试一个单引号 欸,报错了,但是这是一个好消息说明已经进入到了SQL服务器中,说明存在注入点,下面可以开始注入了,payload构造试这样:xxx (符号闭合) or 1=1(注释)现在知道该用什莫符号进行闭合了,然后解释一下我们为什莫要注释,每当我们传递一个值到SQL构造语句中的时候,如果传递的一个值是需要符号修饰的,那末SQL语句会自带一个符号去进行闭合,例如:传值为a,到SQL语句中就会使这样:select xxx,xxx from xxx where id=’a’。那两个单引号就是SQL构造语句中用来进行参数闭合的,简单的说就是,只要你输入一个需要符号修饰的词语,后台就会自动给它加一个修饰符号,这也就是我们为什莫要把前面进行符号闭合,但是后面就会多了一个‘ 符号,我们直接注释掉就好了。 同样的方法,利用order by 可以猜测有几个字段,道理相同,这里就不赘述了。 3x00利用information_schema进行一次注入进行一次完整的入侵过程 3x01了解什莫是information_schema information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式。元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有些时候用于表述该信息的其他术语包括“数据词典”和“系统目录”。 也就是说information_schma可以查到你的所有的搭建的数据库名、表名和列的数据类型,在一切条件未知的情况下,存在注入点的话我们可以直接尝试对information_schema进行访问,从而获得更多的信息。 例如SCHEMATA:提供了当前MySQL实例中所有数据库的信息 TABLES:所有数据库表的信息 CONLUMNS:提供了列信息 3x02union联合注入 既然要从一个信息数据库开始注入,也就是另外一个数据库,我们就不能在当前的数据库下进行查询,但是当前数据库查询下还存在一个注入点,所以说如何才能同时查询两次呢?这个时候我们就可以用到union联合注入了。 首先我们了解一下什莫是union union的作用是将两个或多个select语句查询语句结果合并起来 1.UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分隔 2. UNION中的每个查询的列数(字段数)必须相同 3. UNION会从查询结果集中自动去除了重复行 例子:主查询: select username,password form member where name=“zero“ (union查询)union select id,password form member where id=1 例子构造 payload:xx' union select database(),user()# Database():这个是查询数据库名称 user():这个是使用者权限