下面是我学习sql时做的题,一些是ctfhub上的,之前上次做的时候都是通过看别人wp写的,现在通过自己运用了两种方法重新尝试解答,还有的是NSSctf上的,法一是通过手注,法二是通过sqlmap跑的
整数型注入
法一
打开题目发现让输入1试试,发现注入点
确定为数字型注入
查看字段数(-1是因为id没有负的,这样就会显示错误然后执行后面的查询内容),发现到3时回显有问题,说明字段数是2
查回显位,有两个字段数,所以写到2,得到回显位为1
爆数据库,库名为sqli
爆表名
爆列名
最后爆内容,得到flag
法二
爆库名
爆表名
爆列名
查内容
字符型注入
法一
说明是字符型且是'闭合(这里不知道为什么那个+不显示,而且如果是在下面输入框中输语句+号在url中转变为%2B就会无回显)
输到3时回显有问题,说明字段数为2
看到回显位是1
爆库名
爆表名
爆列名
得到数据
法二
爆库名
爆表名
报错注入
法一
发现存在注入点
报错后就可以开始注入了
爆库名
爆表名
爆列名
查数据
法二
爆库名
爆表名
爆列名
查数据
布尔盲注
法一
发现是字符型注入且是'闭合
接下来要判断数据库长度,然后通过ASCII码确定数据库名,由前面的题可以看出数据库名是sqli,可以直接验证,不知道时就需要运用二分法去逐步确定
在ASCII码中115,113,108,105分别对应着sqli四个字母
接下来就是爆表名,爆列名,查数据,手注会比较复杂,特别是最后查数据,flag很长,每一个字符都需要通过二分法找到对应的ASCII码值,很麻烦,通常情况下还是sqlmap好用一点
法二
爆库名
爆表名
爆列名
查数据
时间盲注
法一
这里知道是时间盲注后过程就和布尔盲注大致一样,都是利用二分法一步步确定,只是这里是通过sleep()函数去确定是否成功执行
法二
爆库名
爆表名
爆列名
查数据
NSSctf [suctf 2019]EasySQL
先输入一个1试试水,发现有回显
然后输入1 and 1=1,发现回显nonono,再输入1'发现什么都没有了
使用堆叠注入语句爆库名1;show databases;
爆表名1;show tables;
后面就查Flag这个表中的flag,但是发现查不了,应该是被过滤了,这里没想法了就参考了一下别人的wp,有两种做法。
法一
一种是需要将flag截断,直接构造payload:*,1然后后端语句就会直接变成select *,1 from flag。
输入*,1,这里会增加一个临时列,他的列名为1,然后那一列的值都为1
法二
另外一种就是1;set sql_mode=PIPES_AS_CONCAT;select 1
相当于是将select 1 和 select flag from Flag 的结果拼接在一起,也就是 select 1;的结果拼接select flag from Flag的结果
把||变成字符串连接符,而不是或
[SWPUCTF 2021 新生赛]error
法一
输入1后发现注入点
发现是字符型注入,且是'闭合
联合查询不能用
尝试报错注入,爆库名
爆表名
爆列名(表users)
里面没flag,就看了test_tb,找到flag
查数据,发现flag只有一半,后面去查了一下发现updatexml函数的输出长度限制,如果只有一半flag就要用到substr(A,B,C)函数(substr(a,b,c)是截取字符函数。a=截取对象 b=截取的位数 c=截取的个数)
得到后半段flag
法二
sqlmap -u 'http://node4.anna.nssctf.cn:28597/index.php?id=1' --current-db
爆库名
sqlmap -u 'http://node4.anna.nssctf.cn:28597/index.php?id=1' -D 'test_db' --tables
爆表名
sqlmap -u 'http://node4.anna.nssctf.cn:28597/index.php?id=1' -D 'test_db' -T 'test_tb' --columns
爆列名(这里由于在手注时知道flag在test_tb里面,就没再尝试users)
sqlmap -u 'http://node4.anna.nssctf.cn:28597/index.php?id=1' -D 'test_db' -T 'test_tb' -C 'flag' --dump
获取数据