(
&self,
client: &reqwest::Client,
url: &Url,
true_payload: &str,
false_payload: &str,
param_index: usize,
pb: &ProgressBar,
)
| 139 | .await? |
| 140 | { |
| 141 | break; |
| 142 | } |
| 143 | } |
| 144 | } |
| 145 | } |
| 146 | Ok(()) |
| 147 | } |
| 148 | |
| 149 | async fn test_boolean_based( |
| 150 | &self, |
| 151 | client: &reqwest::Client, |
| 152 | url: &Url, |
| 153 | true_payload: &str, |
| 154 | false_payload: &str, |
| 155 | param_index: usize, |
| 156 | pb: &ProgressBar, |
| 157 | ) -> Result<bool, reqwest::Error> { |
| 158 | let query_pairs: Vec<(String, String)> = url.query_pairs().into_owned().collect(); |
| 159 | let tested_param = query_pairs[param_index].0.clone(); |
| 160 | let true_url = inject_query_param(url, param_index, |value| format!("{}{}", value, true_payload)); |
| 161 | let false_url = inject_query_param(url, param_index, |value| format!("{}{}", value, false_payload)); |
| 162 | |
| 163 | self.rate_limiter.wait().await; |
| 164 | if let (Some(true_response), Some(false_response)) = ( |
| 165 | self.send_get_request(client, &true_url).await, |
| 166 | self.send_get_request(client, &false_url).await, |
| 167 | ) { |
| 168 | if let (Ok(true_body), Ok(false_body)) = |
| 169 | (true_response.text().await, false_response.text().await) |
| 170 | { |
| 171 | // Diff normalized bodies: raw responses differ on every request |
| 172 | // (random request IDs, CSRF tokens, timestamps) and on reflected |
| 173 | // payload echoes, so a naive != comparison false-positives on |
| 174 | // any dynamic page (verified against freebuff.com). |
| 175 | let true_norm = normalize_boolean_body(&true_body, true_payload); |
| 176 | let false_norm = normalize_boolean_body(&false_body, false_payload); |
| 177 | if true_norm != false_norm { |
| 178 | let vuln = SqlInjectionVulnerability { |
| 179 | url: url.clone(), |
| 180 | parameter: tested_param.clone(), |
| 181 | payload: format!("{} / {}", true_payload, false_payload), |
| 182 | vuln_type: "Boolean-Based".to_string(), |
| 183 | }; |
| 184 | println!( |
| 185 | "[+] SQL Injection Found: {} in {}", |
| 186 | vuln.payload, vuln.parameter |
| 187 | ); |
| 188 | self.reporter.report_sql_injection(&vuln); |
| 189 | return Ok(true); |
| 190 | } |
| 191 | } |
| 192 | } |
| 193 | pb.inc(2); |
| 194 | Ok(false) |
| 195 | } |
| 196 | |
| 197 | async fn measure_url_time( |
| 198 | &self, |
no test coverage detected