原理进一步理解
脚本代码在实现代码与数据库进行数据通信时(从数据库中取出相关的数据进行页面展示),将定义的sql语句进行执行查询数据时,其中的sql语句能够通过参数传递自定义值来控制sql语句,从而执行恶意的sql语句,可以实现查询其他数据(数据库中的敏感数据,如管理员的账号密码)。
之后便是这个数据库中有啥便能干啥(SQL语句查询,删除,添加,修改等操作)
同样sql语句也有写法规则,也就是说必须符合正确的写法才能执行成功。
漏洞产生的根本条件:可控变量 特定函数
id=“ ” 是一个判断必需的可控变量
注:注入语句写在哪个后面表示哪个有注入
eg:?id= -1’) union select 1,2,3 passward=123 如果union注入语句写在123后就表示passward有注入,而这里是id。
2.sql注入流程
1,判断数据库类型
2,判断闭合方式,验证漏洞,判断列数和回显位,取数据,查密码
ACCESS数据库结构
数据库名
表名
列名
数据
注:1. order by 3 -判断字段数
这里的3表示的就是这张表中列的数量
2.查询表名时
union select 1,2,3 from admin
爆出的数据第一个就是表名所在处,第二个就是密码所在处
实际操做中需要我们去猜测它的位置
这里union是联合查询,简单理解为不管多少条语句都可以插入,正常执行并查询
题目实操
进入后,网站的页面是这样的,给了些许提示表明是sql注入,所以直接按照sql注入的一般过程注入看看1、确定注入类型
该题目中有两个输入框,也就是说有两个可以拼接sql的地方,我们在其中任意一个地方进行注入即可。如下图所示,1' or 1=1 #
,这是按照字符型注入的规则输入的万能密码,也就是说后台数据库在查询时,该sql语句的逻辑一定成立。这是我尝试数字型注入一直错误后又用字符型注入后的结果
2、确定字段数和显示顺序
在初步尝试登录成功后,回显了一个字符串,看起来像flag,经过尝试后发现不是,所以接下来还是按照sql注入的步骤进行。我注入1' union select 1, 2, 3 #,注入过程和效果如下图所示,发现Hello处显示了2,Your password is处显示了3,再经过其它测试发现查询的字段数只有3列。结合之前登录成功的界面,可以猜到第2列对应的是用户名,第3列对应的是密码。
3、获取数据库以及表信息
这里将sql注入的步骤融合,经过前面的注入类型确定和字段数确定,接下来的步骤才是真正寻找信息的过程。如下截图所示,展示了泄露出数据库表信息的过程。
使用的注入语句
1' union select 1, 2, group_concat(table_name) from information_schema.tables where table_schema=database() #
这里我猜测大概率flag在表
l0ve1ysq1
中,接下来是泄露出表字段信息,如截图所示。
使用语句
1' union select 1, 2, group_concat(column_name) from information_schema.columns where table_name="l0ve1ysq1" #最后看一下表中的数据是啥,可以发现flag在password字段中,由于数据太长,flag前半部分在右边无法全部截图。
使用语句
1' union select 1, 2, group_concat(password) from l0ve1ysq1 #查阅后知道确定flag所在id后,可以这样打印出来 使用语句
1' union select 1, 2, group_concat(password) from l0ve1ysq1 where id=16 #
小白入门写得不太系统,请多多海涵!