今天来记录新的知识
在互联网时代,数据通常会被存储在存储介质当中,但当我们需要快速查询并实现修改删除等操作的时候,就需要用到更加高效的工具。
数据库是一个按照数据结构来存储和管理数据的软件系统,目前最流行的开源数据库就是Mysql了,并且是一个关系型数据库。
其中运用到结构化查询语言(sql)来进行对数据的增删改查。
如果需要在本机实现Mysql的使用,可以下载phpstudy,其中包含了我们需要的环境等。同时我们可以使用navicat来连接数据库进行可视化。
因为某些历史原因还有php本身的一些特性,我们做题的时候使用更多的会是php写成的题目,当然目前环境变化,也有其他语言写成的题目。
基础的语法都是大差不差的,使用三种结构:顺序、分支、循环。
php使用弱数据类型,并且在变量前添加$,对大小写敏感等等,具体使用方法欢迎自行学习。
php还预定义了很多的超全局变量,可以在任何位置(作用域)使用。
具体用得比较多的我在这里写一些,比如,$_GET、$_POST、$_FILES还有$_GLOBALS。之后如果用到的话,其中具体含义都会细说,没办法一口吃成一个胖子,新进入某个方面没必要开始就面面俱到。(还想要多说几句,网络上面的资源很多,不要单单局限在一篇,当然也要都看进去,不要流于表面。)
接下来展示一段php代码,诸位可以自行思考一下最后的展示结果还有应该如何让他跑通。
<?php
highlight_file(__FILE__);
echo "<br/>";
$id = $_GET['id'];
echo "$id <br/>";
$name = $_POST['name'];
echo "$name <br/>";
$key = $_REQUEST['xingtai'];
echo "{$_REQUEST["xingtai"]} \n";
$refer = $_SERVER['HTTP_REFERER'];
echo "$refer \n";
$xff = $_SERVER['HTTP_X_FORWARDED_FOR'];
echo "$xff \n";
php常用函数
为了能够更多的获取信息等各种目的,我们需要使用自带的函数。
- 有一个var_dump()函数,参数是要查看的数据,会返回具体的信息,包括类型还有长度。
- ord()函数是用来返回字符串的第一个字符的ascii码值的。
- 还有一些自带的加密算法函数:md5()和base64_encode()与base64_decode()。
- 还有扫描当前目录的命令scandir(),参数里面写路径。
- 读文件函数,file_get_contents()和readfile()。前者返回的是一个变量,后者可以直接回显信息。
- eval()和assert()则是执行php语句的函数。
说回到数据库的问题上面!
我们在和网络交互的过程中非常频繁的会使用到数据库,虽然有的还有在前面放上很多东西来减少压力。我们今天关注的并不是数据库本身的实现上,主要关注的是sql这个查询语言上。
一个Mysql或者其他的系统下可以创建很多个数据库(database),一个数据库里面可以有很多的表,里面来存放关系型数据。
现在使用phpstudy来开启相关服务,到navicat里面看一看。
在最开始的时候里面的表挺少的,存放了mysql的一些重要信息。我们进行sql注入的时候最主要关注的就是information_schema这个数据库:
里面有很多的表,(其实现在我也看不懂里面都是一些什么东西,之后可以考虑研究一下),重要的是里面有几个表是我们之后注入经常用到的:schemata、tables、columns。
里面存放了目前mysql下所有数据库的名字、所有数据库下的表名、所有表的列名。
前置知识还有一下,那就是sql的基础语法还有建表等语法,在这里我不想费太长的篇幅。如果想要具体学习,我推荐大家访问程序员鱼皮先生的一个sql教程网站:SQL之母。这个网站是使用http链接的,如果使用https会获取到错误的网页,可以把协议中的's'去掉,并选择其他浏览器重试。目前是这个情况。
如果没有navicat,也可以使用命令行进行操作,不过可视化可能不是很好。这里也给出方法:
mysql -u <用户名> -p 回车然后输入密码即可
例:用户名root 密码为123
$ mysql -uroot -p
Enter password: ***
我们可以使用show databases/tables来展示数据库和表,后者需要使用ues <datebaes_name>后使用。我们可以使用select version();来查看数据库版本,使用select database()来查看当前所在的数据库。
create database hello;
use hello; #在操作某个表时,是个要注意的点
还是那句话,如果你不写,只是看的话觉得什么都明白,写起来用起来才知道什么叫做困难。
继续,我们使用select * from hello;来查询数据,当然详细的使用可以去上面链接学习,不详细的就听我边写边讲。我们可以使用inset into <table_name> (column_1,column_2,column_3) values(value,value,value);来插入表信息,多说一句前面那个括号里面的参数写法是蛇形命名规则,蛇形复数就是单词变复数。
使用update hello set age=100 where name="张观人";类似写法来更新数据,where后面是筛选条件。
sql注入的原理就是利用网站不完善的过滤机制,找到注入点然后获取所需信息。放在夺旗赛里面主要就是为了找到flag来得分。
通常的注入点有时候会是用户名和密码输入上,下面来讲一下通常的后端验证过程。
用户输入账号密码信息,系统在数据库里面查找相应账号对应的信息,它会将用户输入的密码进行相同的哈希计算,然后将其和查找到的哈希值进行比较,如果正确则返回。其中数据库和sql做到的东西其实就是查数据和返回数据,暴露出来的问题也就在这里,如果可以绕过检验,就可以自行查找到自己想要的信息并返回到本机。